这个C ++ getter-like语法错了吗?

时间:2010-10-15 19:48:43

标签: c++ getter

说我有以下课程:

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.

(我应该回答我的问题还是继续编辑我的帖子?我是新的)

10 个答案:

答案 0 :(得分:11)

一些注意事项:

  • int getID()应该是一个const方法。
  • 为什么setID()有一个int返回类型?它不返回值。这怎么会编译?
  • 你确定意外的结果是因为getter / setter吗?你有一个简短的测试程序来证明这个问题吗?
编辑:既然您发布了代码,我会认为某些东西正在捣乱您的变量。你用的是什么编译器?内存断点是告诉你发生了什么的最快方法。假设这不是一个选项,请将代码撒上调试输出,显示变量的当前值并进行除法和征服,直到找到它被踩到的位置。

此外,您发布的新代码仍未显示任何实际用法。一个简单的测试程序会有所帮助。

答案 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; }

注意:我通常建议不要在任何地方放置“这个”。当你调用一个成员(函数或数据)或一个局部变量(假设你没有全局变量)时,它应该很明显;)