说我有以下课程:
class Abc {
int id;
public:
int getID() { return id; }
int setID(int id) { this->id = id; }
};
这有什么逻辑错误吗?我似乎得到了意想不到的结果(读取:id的错误值)。我知道这不是编写getter的方法..但是这段代码中仍然没有任何错误吗?
这是类声明:
class ClientConn {
static int num;
short pos;
sockaddr_in tcpAddress;
sockaddr_in udpAddress;
int connFD;
public:
ClientConn();
int getConnFD();
void setConnFD(int connFD);
void setPos(short pos);
short const& getPos();
void setUdpAddress(short port);
void setTcpAddress(sockaddr_in address);
void setUdpAddress(sockaddr_in address);
void setTcpAddress(short port, char* serverIP);
void setUdpAddress(short port, char * serverIP);
sockaddr_in const& getTcpAddress() const;
sockaddr_in const& getUdpAddress() const;
};
这两个函数的定义如下:
int ClientConn :: getConnFD() {
return connFD;
}
void ClientConn :: setConnFD(int connFD) {
this->connFD = connFD;
}
我使用setter将connFD的值设置为7,然后当我使用getter时,我得到的值为65534.
(我应该回答我的问题还是继续编辑我的帖子?我是新的)
答案 0 :(得分:11)
一些注意事项:
此外,您发布的新代码仍未显示任何实际用法。一个简单的测试程序会有所帮助。
答案 1 :(得分:6)
int setID(int id) { this->id = id; }
应替换为
void setID(int id) { this->id = id; }
你应该声明一个构造函数来初始化id的值。
答案 2 :(得分:3)
您必须使用0
初始化int id答案 3 :(得分:3)
确保在构造函数中初始化id
。也就是说,不要盲目创建访问者。当你添加代码总是有意识地知道它有充分的理由。
答案 4 :(得分:2)
不会/不应该编译。你的setter应该有一个'void'返回类型。
答案 5 :(得分:1)
int getID() { return id; }
这很好,但它应该是const:
int getID() const { return id; }
int setID(int id) { this->id = id; }
这不应该返回值:
void setID(int id) { this->id = id; }
答案 6 :(得分:1)
我的水晶球(和EboMike的编辑)说:
您在
connFD
中覆盖void setUdpAddress(short port, char * serverIP);
。您应该使用sockaddr
而不是sockaddr_in
。你的幸运数字是3,27和0x4f。
答案 7 :(得分:0)
您的代码对我来说正确(并且正常):
#include <iostream>
class Abc {
int id;
public:
int getID() { return id; }
int setID(int id) { this->id = id; }
};
int main ()
{
std::cout << "Hello World\n";
Abc abc;
abc.setID(5);
std::cout << "Result: " << abc.getID() << "\n";
}
结果如预期:
me@here:~/tmp$ ./a.out
Hello World
Result: 5
答案 8 :(得分:0)
我想知道你是否因为没有初始化id
而得到意想不到的结果。实例化类时,id
的值未初始化。默认情况下,C ++ 不设置为零。因此,如果您在致电getID()
之前致电setID()
,您将获得无法预测的结果。
以下是正确初始化id
的类的修订版,将getter标记为const
并从setter中删除不必要的返回值。我还使用了向私有成员变量添加下划线(_
)的通用约定。这只是个人偏好的问题。
class Abc {
int id_;
public:
// default constructor that initializes 'id_' to zero
Abc() : id_(0) {}
int getID() const { return id_; }
void setID(int id) { id_ = id; }
};
答案 9 :(得分:0)
在你的内心:
int setID(int id) { this->id = id; }
为什么你认为“id”也不是会员?你不能。 这同样有效:
int setID(int id) { id = id; } // problem get's obvious now.
我打赌你将你的(未初始化的)变量分配给它已经拥有的值。
试试这个:
void setID(int newId) { this->id = newId; }
注意:我通常建议不要在任何地方放置“这个”。当你调用一个成员(函数或数据)或一个局部变量(假设你没有全局变量)时,它应该很明显;)