这种C++吸气剂式语法是错误的吗?

这种C++吸气剂式语法是错误的吗?,c++,getter,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

假设我有以下课程:

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


我应该回答我的问题还是继续编辑我的帖子?im new

您必须使用0初始化int id,该值不会/不应该编译。您的setter应该有一个“void”返回类型。

一些注意事项:

int getID应该是一个const方法。 为什么setID有int返回类型?它不返回值。这是如何编译的? 您确定意外的结果是因为getter/setter吗?您是否有一个简短的测试程序来演示问题? 编辑:既然你发布了你的代码,我会假设有什么东西在践踏你的变量。你在用什么编译器?内存断点是告诉您发生了什么的最快方式。假设这不是一个选项,在代码中加入显示变量当前值的调试输出,然后进行分治,直到找到它被踩到的地方

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

 int setID(int id) { this->id = id; }
应该由

void setID(int id) { this->id = id; }
您应该声明一个构造函数来初始化id的值。

请确保在构造函数中初始化id。也就是说,不要盲目地创建访问器。当你添加代码时,你总是有意识地知道这是有原因的

int getID() {   return id; }
这很好,但应该是常量:

int getID() const {   return id; }


int setID(int id) { this->id = id; }
这不应返回值:

void setID(int id) { this->id = id; }

您的代码对我来说外观和工作正常:

#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";
}

我想知道您是否因为没有初始化id而得到意外的结果。当您实例化类时,id的值未初始化。默认情况下,C++没有设置为零。因此,如果在调用setID之前调用getID,将得到不可预测的结果

下面是您的类的修订版本,它正确初始化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; }
};

我的水晶球和迈克的编辑说:

在void setUdpAddressshort端口char*serverIP;中覆盖connFD;。您应该在中使用sockaddr而不是sockaddr\u。您的幸运数字是3、27和0x4f

在您的内部:

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

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

也许可以举一个例子,说明你是如何使用它并得到意想不到的结果的。请描述您的期望和实际观察到的结果。我觉得这段代码不错。你能发布你的测试代码吗?您是如何诊断它产生了错误的id值的?如果您使用setter和getter,那么id是私有的是一个很好的实践,但是您应该得到定义非常好的结果,我们可以看到更多的代码吗?什么意外的结果?我看这里没有什么大的错误,除了setID有一个int返回类型,而您没有返回任何东西。@David-id是私有的。默认情况下,类中的所有内容都是私有的。它应该是私有的,正如编写得很好的文件可能会将其定义为const一样。这样,即使只有对Abc的常量引用,您也可以选择读取该值。@Dead:写入常量需要时间吗?一点也不难。我也喜欢在一个合理的时间范围内开发,这就是为什么我要确保我的不变量保持不变……花在将常量正确性放入本应在第一次编写代码时以常量正确性编写的代码中的时间是值得的,因为从长远来看是值得的。-我帮你修好了。@AnkurVj:不要用代码。将其缩进4个空格,或者选择它,然后单击100101按钮。@Dead如果有更多的经验,您将了解到您没有时间编写快速代码。它应该可以编译。你会因为调用它而得到未定义的行为。两者的区别是什么。。可能会出现什么样的错误?sockaddr保证能够保存sockaddr_,以及您可能遇到的任何其他地址类型。如果调用一个需要sockaddr的函数,那么它可能会假定它比sockaddr_中的空间更大,并覆盖它后面的内容。不过,这是非常依赖于编译器的。C++的隐藏名字规则非常清楚。id表示函数参数,而不是此->id。
void setID(int newId) { this->id = newId; }