2013-08-21 199 views
0

以下代码是教程的一部分。我检查了代码对本教程许许多多次,虽然它的工作原理上的视频,我的程序有以下错误:错误LNK2019:函数_main中引用的无法解析的外部符号“public:__thiscall rectangle :: rectangle(void)”(?? 0rectangle @@ QAE @ XZ)

1>------ Build started: Project: simpleclass, Configuration: Debug Win32 ------ 
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall rectangle::rectangle(void)" ([email protected]@[email protected]) referenced in function _main 
1>C:\Users\Bob K\Documents\Visual Studio 2010\Projects\simpleclass\Debug\simpleclass.exe : fatal error LNK1120: 1 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

这是代码:

#include <iostream> 

class rectangle 
{ 
private: 
    double length; 
    double width; 
public: 
    rectangle(); 
    ~rectangle(); 
     double calcperim() const; 
     double calcarea() const; 
     double getlength() const; 
     double getwidth() const; 
     void setlength(double l); 
     void setwidth(double w); 

}; 

rectangle::~rectangle() 
{ 
} 

double rectangle::calcperim() const 
{ 
    return (length + length + width + width); 
} 

double rectangle::getlength() const 
{ 
    return length; 
} 

double rectangle::getwidth()const 
{ 
    return width; 
} 

void rectangle::setwidth(double w) 
{ 
    width = w; 
} 
void rectangle::setlength(double l) 
{ 
    length = l; 
} 

double rectangle::calcarea() const 
{ 
    return (length * width); 
} 



int main() 
{ 
using namespace std; 

    rectangle r; 
    r.setwidth(3); 
    r.setlength(9); 

    cout << "length " << r.getlength() << endl; 
    cout << "width " << r.getwidth() << endl; 
    cout << "perimiter: " << r.calcperim() << endl; 
    cout << "Area: " << r.calcarea() << endl; 


    system("pause"); 
return 0; 
} 

请帮助。我曾经在几年前编制过程,但我正在努力回到过去。

回答

5

你缺少rectangle构造

rectangle::rectangle() 
{ 
    length = 0; 
    width = 0; 
} 

的实现或者,如果你不关心初始化成员,只是删除从类定义构造函数的定义。 (请注意,这可能不是可取的;我只是为了完整而包括它。)

+1

这两行是**赋值**,不是初始化。初始化是在恰当命名的初始化列表中完成的,而不是在构造函数的主体中完成的:'rectangle :: rectangle:length(0),width(0){}'如果你不初始化成员,它们将被初始化;对于整数成员它并不重要,但是如果初始化和赋值很昂贵,最好是初始化而不是初始化然后赋值。 –

+0

@PeteBecker我在这里避免使用一个初始化列表,因为它对答案并不重要,似乎为初学者增加了额外的复杂性。尽管对这个sl termin的术语有所了解。我对你关于内置类型自动初始化的评论感兴趣。我不认为内置类型的成员默认设置为任何可预测的值(调试器和valgrind似乎同意)。你是否在说别的,或者是建立在被认为具有不设定其价值的构造函数的类型中? – simonc

相关问题