2011-10-10 72 views
2

好了,我已经决定要读一点C++,然后现在,只是为了让语法有基本的了解。我熟悉Java和一点Python。我已经通过C++读取了傻瓜书,并且我认为自己掌握了 - 直到我尝试创建最简单的课程。 当时的想法是非常简单:一类(名为猿)接受一个参数,一个int,它被存储为一个私有字段。它有一个其他函数,一个返回函数,它返回该字段。 main()创建一个实例,并调用该方法打印出变量。简单的C++构造函数不工作(很基本的)

当时的想法是使用一个字符串,而不是一个整数,但我无法得到它的工作,所以我决定用一个int来代替,这很明显,没有任何工作。

如果是任何利息我使用的代码::块,Windows 7和g ++编译器。

这里是类:

Main.cpp的

#include <iostream> 
#include "ape.h" 

using namespace std; 

int main() 
{ 
    ape asd(10); 
    cout << asd.getNumber(); 
} 

ape.h

#ifndef APE_H 
#define APE_H 

class ape 
{ 
    public: 
     ape(int num); 
     virtual ~ape(); 
     int getNumber(); 
    protected: 
    private: 
     int number; 
}; 

#endif // APE_H 

和ape.cpp

#include "ape.h" 
using namespace std; 

ape::ape(int num) 
{ 
    tall = num; 
} 

ape::~ape() 
{ 
    //dtor 
} 

int getNumber() 
{ 
    return number; 
} 

错误消息我得到的似乎对我来说非常随意,因为他们正在改变完全随着我做出的每一个变化,都不是很自我解释。我可以看到我怎么听起来像一个自大的傻瓜,而这整个混乱是编译器的错,但我真的没有看到错误消息,什么是错误的,我的代码之间的任何连接。

这里别紧张我,第一次。 :)

我想我也许应该补充的错误消息: 未定义的引用“猿猿::(INT)”

+0

你在哪里定义高? – Mansuro

回答

1

您将值分配给一个不存在的变量。

变化:

ape::ape(int num) 
{ 
    tall = num; 
} 

要:

ape::ape(int num) : 
    number(num) 
{ 
} 

而且,我不知道为什么你写析构函数,为什么你决定把它virtual。默认情况下,编译器将生成一个空的析构函数(类似于你的,但不是virtual)。如果你不打算做多态(使用继承和所有这些“东西”),你可以从代码中删除这个析构函数,因为它只会带来复杂性而无法获得收益。

您还需要与类的名称前缀的方法定义

int ape::getNumber() // Note the "ape::" here 
{ 
    return number; 
} 

最后一两件事:

您problably还想更改main

int main() 
{ 
    ape asd(10); 
    cout << asd.getNumber() << endl; 
} 

只有当输出时才会打印输入endl o r flush作为流被缓冲。

关于上次编辑:

我想我也许应该补充的错误消息:未定义的引用 为“猿猿::(INT)”

你可能失败,链接ape.o。在您的编译文件夹中,您应该有每个.cpp的源文件和.o。您必须将这些目标文件连接在一起以构建您的程序。此消息表明链接程序无法找到ape::ape(int)的定义。那是他可能没有被给予ape.o文件。

长话短说,这里就是你的编译命令应该是什么样子(使用G ++):

g++ -o main.o -c main.cpp 
g++ -o ape.o -c ape.cpp 
g++ -o program main.o ape.o 
+0

这只是Code :: blocs文件的自动生成。我想我可以不选中有析构函数的选项,但我没有打扰。 – MartinHaTh

+0

@MartinHaTh哦,我明白了。我不使用Code :: Blocks。其他点静立不动;)希望这可以帮助。 – ereOn

+1

这些命令做到了。那么我猜这是Code :: blocks fault。 感谢您的帮助。 – MartinHaTh

0

您正在使用未申报领域“高”。好像你的构造应该是:

 
ape::ape(int num) 
{ 
    number = num; 
} 
+0

始终使用初始化列表来初始化字段。 –

+0

噢,好吧,我的不好,为了简​​单起见,我正在用挪威语写部分字段和函数名,我想我错过了那个。在发布之前,我正在更改所有名称。 – MartinHaTh

3

没有太大而不实际的错误消息说,但至少这里有一个问题:

int getNumber() 
{ 
    return number; 
} 

这应该是int ape::getNumber()。同样在你的代码中,tall没有定义,应该是number而不是?

0
ape::ape(int num) 
{ 
    tall = num; 
} 

高吗? tall从哪里来?该成员被宣布为number

更好的将是

ape::ape(int num) { number = num; } 

好多是

ape::ape(int num) : number(num) { } 
0

什么是高?私人领域被称为在你的榜样数,所以这个功能:

ape::ape(int num) 
{ 
    tall = num; 
} 

应该是:

ape::ape(int num) 
{ 
    number = num; 
} 

然而,在C++中,你应该使用初始化而不是分配。虽然int不是什么大问题,但对于更复杂的对象,在复制对象时分配会更加昂贵,而在初始化时可以使用复制构造函数。因此约定是在构造函数的主体之前初始化所有变量。

ape::ape(int num) 
    : number(num) 
{ 
} 

而且,请将getNumber()声明为const方法。在这里,你有一个很好的向导解释所有的常量变种:http://developer.kde.org/~wheeler/cpp-pitfalls.html

当你在它,添加缺失类的前缀,你需要的,如果你定义的类的声明之外的方法:

int ape::getNumber() const 
{ 
    return number; 
} 

作为最后一条评论,我建议你寻找关于命名成员变量的约定。典型的是mNumber或_number。稍后让您更轻松地阅读您自己的代码。

0

您需要在构造函数中设置变量number,然后才能在getNumber中读取它。 试试这个:

ape::ape(int num) 
{ 
    number = num; 
}