代码之家  ›  专栏  ›  技术社区  ›  AnkurVj

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

  •  0
  • AnkurVj  · 技术社区  · 14 年前

    假设我有以下课程:

    class Abc {
    
        int id;
    
    public:
    
        int getID() {   return id; }
    
    
        int setID(int id) { this->id = id; }
    };
    

    这里面有逻辑错误吗?我似乎得到了意想不到的结果(读:错误的id值)。我知道这不是写感人事迹的方法。。但这段代码中仍然没有任何错误吗?

    下面是类声明:

    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 回复  |  直到 14 年前
        1
  •  11
  •   EboMike    14 年前

    几点注意事项

    • int getID()应该是一个常量方法。
    • 为什么setID()有int返回类型?它不返回值。这是如何编译的?
    • 您确定意外结果是由于getter/setter造成的吗?你有一个简短的测试程序来演示这个问题吗?

    编辑:既然你已经发布了你的代码,我就假设有什么东西在践踏你的变量。你在用什么编译器?内存断点是告诉您发生了什么的最快方式。假设这不是一个选项,在代码中撒上显示变量当前值的调试输出,然后进行除法运算,直到找到它被践踏的位置。

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

        2
  •  6
  •   Xavier V.    14 年前
     int setID(int id) { this->id = id; }
    

    应替换为

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

        3
  •  3
  •   OlimilOops    14 年前

    必须用0初始化int id

        4
  •  3
  •   wilhelmtell    14 年前

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

        5
  •  2
  •   psychotik    14 年前

        6
  •  1
  •   Benjamin Lindley    14 年前
    int getID() {   return id; }
    

    这很好,但应该是常量:

    int getID() const {   return id; }
    
    
    int setID(int id) { this->id = id; }
    

    这不应返回值:

    void setID(int id) { this->id = id; }
    
        7
  •  1
  •   halfer Rajnish Kumar    6 年前

    我的水晶球(和埃博麦克的编辑)说:

    connFD 在你的 void setUdpAddress(short port, char * serverIP); . 你应该用 sockaddr sockaddr_in . 你的幸运数字是3,27和0x4f。

        8
  •  0
  •   jsight TaherT    14 年前

    你的代码对我来说是正确的:

    #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
    
        9
  •  0
  •   Nate    14 年前

    我想知道您是否因为没有初始化而得到意外的结果 id . 当您实例化类时 未初始化。C++做的 默认设置为零。因此,如果你打电话 getID() setID() ,你会得到不可预测的结果。

    身份证件 ,将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; }
    };
    
        10
  •  0
  •   user432300    14 年前

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

    为什么你认为“身份证”不是会员?你不能。 这同样有效:

    int setID(int id) { id = id; } // problem get's obvious now.
    

    我敢打赌,您正在将(未初始化的)变量分配给它已经具有的值。

    试试这个:

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