2013-05-01 207 views
1

我是新的C++,我跑在Visual Studio中下面的代码C++结构初始化++错误

struct bob 
    { 
     double a,b;  
     bob(double a,double b); 
    } 

    int main() 
    { 
     bob z(2.2,5.6); 
     cout<<z.a<<endl; 
     keep_window_open(); 
     return 0; 
    }  

当我运行这段代码,我得到以下错误:

错误1个错误LNK2019:函数_main中引用的未解析外部符号“public:__thiscall bob :: bob(double,double)”(?? 0bob @@ QAE @ NN @ Z)C:\ drives \ Comp-Mech \ programming \ VS \ C++ \项目\ E1 \ E1.obj E1

+0

你只声明'bob(double a,double b);',你的实现在哪里? – johnchen902 2013-05-01 12:35:35

+0

功能请求C++ 17:自动构造函数从其声明写入为'bob(double,double)= default;'和签名与数据成员匹配时生成。 – TemplateRex 2013-05-01 12:36:19

+0

@rhalbersma:为什么?为什么不完全删除构造函数并使用聚合初始化? – 2013-05-01 12:40:57

回答

5

你需要实现你的类bob的构造函数:

bob::bob(double a,double b) : a(a), b(b) {} 
+0

我不认为'a(a)'有效。 – john 2013-05-01 12:36:00

+5

是的,它的确如此...... – piokuc 2013-05-01 12:36:54

+0

虽然有一个冒号丢失。 – 2013-05-01 12:38:36

1

这是因为您还没有编写bob::bob(double, double)的代码。

struct bob 
{ 
    double a,b;  
    bob(double aa, double bb) a(aa), b(bb) {} 
}; 
3

您已经提供了bob的构造函数的声明,但是你没有给一个定义。该定义给出了构造函数的实现,并说明了它应该做什么。在这种情况下,你可能希望你的构造函数,它的参数分配给对象的成员变量:

bob::bob(double a, double b) 
{ 
    this->a = a; 
    this->b = b; 
} 

我在上面的代码中使用赋值,因为你更容易熟悉它。但是,你应该知道成员初始化列表,让你可以直接初始化成员:

bob::bob(double a, double b) 
    : a(a), b(b) 
{ } 

这说来初始化成员a的说法a并初始化成员b的说法b。它还避免了在分配给成员之前潜在的昂贵的成员默认初始化。

+0

这是一个结构,所以不需要明确的公开 – piokuc 2013-05-01 12:36:33

+0

@piokuc注意到它后立即注意到。 – 2013-05-01 12:37:22

+0

您可能会提到,对于具有默认构造函数的用户定义类型,成员初始值设定项也会更有效率,因为它避免了双重初始化。 – TemplateRex 2013-05-01 12:41:15