打印

c++ 问题,请进

[复制链接]
1463|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mybao|  楼主 | 2008-10-7 23:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

class myclass1 
{
   unsigned b0;  
   unsigned b1;
   unsigned b2;
   unsigned b3;    
public:   
     static   myclass1 *myclass1_p;

    void ff(void)
    {
       myclass1_p=this;
    }   

};

myclass1  myclass1_obj;
void myfunc(void)
{
    myclass1_obj.ff();
}

 
编译不出错,build出错,提示如下:

undefined                        first referenced
 symbol                              in file
---------                        ----------------
myclass1::_myclass1_p 


请教,到底怎么回事?

相关帖子

沙发
hotpower| | 2008-10-8 00:29 | 只看该作者

不要static

class myclass1 
{
private:
   unsigned b0;  
   unsigned b1;
   unsigned b2;
   unsigned b3;    
public:   
    myclass1 *myclass1_p;

    void ff(void)
    {
       myclass1_p=this;
    }   

};
myclass1 myclass1_obj;

void myfunc(void)
{
    myclass1_obj.ff();
}

使用特权

评论回复
板凳
mybao|  楼主 | 2008-10-8 12:33 | 只看该作者

大叔果然是C++高手啊

为什么加static就不行呢?原因是什么,而且compile也不报错

使用特权

评论回复
地板
HWM| | 2008-10-8 15:51 | 只看该作者

用也可以,但要另加特殊说明。

使用特权

评论回复
5
HWM| | 2008-10-8 15:56 | 只看该作者

参考我以前的 C++ 随笔

C++ 随笔-4,静态成员变量和静态成员函数 
 HWM 发表于 2008-4-8 21:14 新手园地 ←返回版面   举报该贴 


考察下面的例子:

class class_A
{
    int x;
    static int a;
    static int add( int i, int j ) { return (i + j); }
    
    public:
    
    class_A( void ) { x = 10; a = 20; }
    int get_x( void ) { return x; }
    void set_x( int i ) { x = i; }
    void set_a( int i ) { a = i; }
    void Do_it( void ) { x = add( x, a ); }
};

int class_A::a;
class_A A, B;
int Y, Z;

int main( void )
{
    A.set_x( 30 );
    A.set_a( 40 );
    A.Do_it();
    B.Do_it();
    Y = A.get_x();
    Z = B.get_x();
    
    while ( 1 )
    {
    }
}

我们发现有两个奇怪的成员和一个奇怪的变量,下面把它们提取出来:

static int a;
static int add( int i, int j ) { return (i + j); }

int class_A::a;

首先分析一下static int a,这是类class_A的一个成员变量。特殊的是在变量说明之前加了一个关键字static,这样成员变量a就变成了“静态”的了。这里静态的意思就是在存储器中分配一个“固定的”存储空间,使类class_A的所有实例化对象中的相应成员变量a都被定位在这个固定的存储空间上,实现了类class_A的所有对象(在此是A和B)共享变量a。为了表明这个“固定的”存储空间的存在,在全局变量定义中增加了一条相关的定义,即int class_A::a;,而这就是我们看到的那个奇怪的变量。

现在再看看另一个奇怪的成员static int add( int i, int j ) { return (i + j); },这是类class_A的一个成员函数。特殊的是在函数说明之前同样加了一个关键字static,这样一来函数add也变成“静态”的了。在类的封装中我们曾经说过,成员函数有一个隐形指针(this)作为输入参数,这也是封装所付出的代价。这个代价是否可以避免,若能又可在何种情况下避免呢?首先来分析一下为何要使用这样一个指针。我们知道成员函数代码是被类的所有实例化对象所共享的,成员函数只知道所在类的成员地址在对象中的相对偏移量,而不清楚具体对象存储空间的绝对地址。所以如果要使用所在类的其他成员就必须得到相应对象的地址——this。但从另一方面来说,如果成员函数不使用所在类中的其他成员,这个对象地址硬传给它不就成多余的吗?是否存在不用传对象地址的成员函数呢?回答是肯定的。前面我们看到的那个变成“静态”的函数恰恰就是我们所要的函数——静态函数。静态函数和非静态函数的差别就在于是否传递对象指针。
 
 

使用特权

评论回复
6
hotpower| | 2008-10-8 18:54 | 只看该作者

static的应用

class myclass1 
{
private:
   unsigned b0;  
   unsigned b1;
   unsigned b2;
   unsigned b3;    
public:   
    static myclass1 *myclass1_p;

    void ff(void)
    {
    myclass1::myclass1_p=this;
    }

};


myclass1 myclass1_obj,myclass2_obj;
myclass1* myclass1::myclass1_p = &myclass1_obj;

void myfunc1(void)
{
    myclass1_obj.ff();
}
void myfunc2(void)
{
    myclass2_obj.ff();
}


int main (void) 
{
  myfunc1();
  myfunc2();
}

使用特权

评论回复
7
mybao|  楼主 | 2008-10-8 19:23 | 只看该作者

感谢HWM

加上
myclass1 * myclass1::myclass1_p;
可以build了。

使用特权

评论回复
8
mybao|  楼主 | 2008-10-8 19:31 | 只看该作者

还有一个问题

inline void *operator new(size_t size, void *ptr)
{
    return ptr;
}


void cyg_thread_create(
    cyg_addrword_t      sched_info,
    cyg_thread_entry_t *entry, 
    cyg_addrword_t      entry_data, 
    char *name, void *stack_base,    
    cyg_ucount32        stack_size,  
    cyg_handle_t *handle, 
    cyg_thread          *thread ) 
{

    Cyg_Thread *t = new((void *)thread) Cyg_Thread (
        (CYG_ADDRWORD) sched_info,
        (cyg_thread_entry *)entry,
        (CYG_ADDRWORD) entry_data,
        name,
        (CYG_ADDRWORD) stack_base,
        stack_size
        );
    t=t;
    
    *handle = (cyg_handle_t)thread;
}


Cyg_Thread 是构造函数。
请教        t=t;  
   这句有什么意义?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

759

帖子

3

粉丝