在运行时再次“未定义的符号”,C++

mah*_*ood 6 c++ runtime undefined-symbol

我有一个数据类型,我可以实例化该类型的变量。像这样:

FetchAddr faddr(VirtualMemoryAddress( 0x0a ));
Run Code Online (Sandbox Code Playgroud)

FetchAdr 的定义是:

struct FetchAddr {
   VirtualMemoryAddress theAddress;
   FetchAddr(VirtualMemoryAddress anAddress)
     : theAddress(anAddress)
   { } 
};
Run Code Online (Sandbox Code Playgroud)

现在我有一个类 faddr 是一个私有(或公共)变量

class FLEXUS_COMPONENT(BPred)  {
   static FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS )
     {
        faddr = VirtualMemoryAddress( 0x0a );
     }
   ...
}
Run Code Online (Sandbox Code Playgroud)

假设宏定义正确。

代码编译和链接没有任何问题。但是,当我启动程序时,它说:

 "undefined symbol: _ZN6nBPred14BPredComponent8faddr"
Run Code Online (Sandbox Code Playgroud)

它说 faddr 没有符号。

有什么想法吗?

Bo *_*son 4

当您声明静态成员时,您还必须在某个地方定义它,例如在 .cpp 文件中。并且还要记住链接到该文件。

\n\n
\n\n

问题 2 -FetchAddr没有默认构造函数。

\n\n

如果您需要有faddr作为类的静态成员,则还需要在定义时为其指定一个值,例如:

\n\n
FetchAddr FLEXUS_COMPONENT(BPred)::faddr(VirtualMemoryAddress( 0x0a ));\n
Run Code Online (Sandbox Code Playgroud)\n\n

这创造了一个faddr所有人共享的FLEXUS_COMPONENT(BPred)

\n\n

如果您希望每个对象都有自己的副本faddr,则可以将其设置为非静态并在构造函数中对其进行初始化:

\n\n
class FLEXUS_COMPONENT(BPred) \xc2\xa0{\n\xc2\xa0  FetchAddr faddr;\n\xc2\xa0 \xc2\xa0public:\n\xc2\xa0 \xc2\xa0 \xc2\xa0FLEXUS_COMPONENT_CONSTRUCTOR(BPred)\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 : base( FLEXUS_PASS_CONSTRUCTOR_ARGS ),\n          faddr(VirtualMemoryAddress( 0x0a ))\n\xc2\xa0 \xc2\xa0 \xc2\xa0{\xc2\xa0}\n\xc2\xa0 \xc2\xa0// ...\n};\n
Run Code Online (Sandbox Code Playgroud)\n