好的,所以我决定不时地阅读一些c ++,只是为了对语法有一个基本的了解。我熟悉Java,还有一点Python。我已经通过c ++阅读了傻瓜书,我认为自己掌握了 - 直到我试图创建最简单的类。 这个想法是非常简单:一个类(名为ape)接受一个参数,一个int,存储为私有字段。它还有另一个函数,一个返回函数,它返回字段。 main()创建一个实例,并调用该方法打印出变量。
这个想法是使用一个字符串而不是一个int,但我无法使它工作,所以我决定使用一个int,显然,它也没有工作。
如果有任何兴趣,我使用Code :: blocks,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;
}
我得到的错误消息对我来说似乎很随机,因为它们随着我所做的每一次改变而完全改变,并且不是很自我解释。我可以看到我听起来像一个傲慢的傻瓜,这整个混乱是编译器的错误,但我真的没有看到错误消息和我的代码中的错误之间的任何联系。
第一次来这里,放轻松。 :)
我想我应该添加错误消息: 对'ape :: ape(int)'
的未定义引用答案 0 :(得分:3)
没有实际的错误消息,没什么可说的,但至少这是一个问题:
int getNumber()
{
return number;
}
这应该是int ape::getNumber()
。您的代码中也没有tall
的定义,或许应该是number
?
答案 1 :(得分:1)
您正在为不存在的变量分配值。
变化:
ape::ape(int num)
{
tall = num;
}
要:
ape::ape(int num) :
number(num)
{
}
此外,我不知道你为什么写了一个析构函数,为什么你决定把它作为virtual
。默认情况下,编译器将生成一个空的析构函数(与您的类似,但不是virtual
)。如果你不打算做多态(带继承和所有“东西”),你可以从代码中删除这个析构函数,因为它只会带来复杂性而无法获得。
您还需要在方法定义前加上类名:
int ape::getNumber() // Note the "ape::" here
{
return number;
}
最后一件事:
您可能想要更改main
:
int main()
{
ape asd(10);
cout << asd.getNumber() << endl;
}
只有当流缓存后输出cout
或endl
时才会打印放入flush
的内容。
关于您的上一次修改:
我想我应该添加错误消息:undefined reference 到'ape :: ape(int)'
您可能无法与ape.o
相关联。在编译文件夹中,您应该拥有源文件,并且每.o
都有一个.cpp
。您必须将这些目标文件链接在一起才能构建您的程序。此消息表明链接器无法找到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
答案 2 :(得分:0)
您正在使用未申报的字段“tall”。好像你的构造函数应该是:
ape::ape(int num) { number = num; }
答案 3 :(得分:0)
ape::ape(int num)
{
tall = num;
}
高? tall
来自哪里?该成员被声明为number
。
最好是
ape::ape(int num) { number = num; }
好多了
ape::ape(int num) : number(num) { }
答案 4 :(得分:0)
什么高?私有字段在您的示例中称为数字,因此此函数:
ape::ape(int num)
{
tall = num;
}
应该是:
ape::ape(int num)
{
number = num;
}
但是,在C ++中,您应该使用初始化而不是分配。虽然对于int来说并不是什么大问题,但是对于更复杂的对象,在复制对象时分配更加昂贵,而在初始化时,可以使用复制构造函数。因此,惯例是在构造函数体之前初始化所有变量。
ape::ape(int num)
: number(num)
{
}
并且,请将getNumber()声明为const方法。在这里,您有一个很好的指南解释所有const变体:http://developer.kde.org/~wheeler/cpp-pitfalls.html
当你在它的时候,添加缺少的类前缀,如果你在类的声明之外定义方法,你需要它:
int ape::getNumber() const
{
return number;
}
作为最后一条评论,我建议你寻找一个关于命名成员变量的约定。典型的是mNumber或_number。稍后可以更轻松地阅读您自己的代码。
答案 5 :(得分:0)
您需要在构造函数中设置变量number
,然后才能在getNumber
中阅读它。
试试这个:
ape::ape(int num)
{
number = num;
}