этот синтаксис подобный геттеру C ++ неправильный - PullRequest
0 голосов
/ 15 октября 2010

Скажите, у меня есть следующий класс:

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

Я установил значение connFD равным 7, используя установщик, а затем, когда я использовал получатель, я получил значение 65534.

(Должен ли я ответить на мой вопрос или продолжить редактирование своего сообщения? Я новичок)

Ответы [ 10 ]

11 голосов
/ 15 октября 2010

Несколько замечаний:

  • int getID () должен быть методом const.
  • Почему setID () имеет тип возвращаемого значения int?Это не возвращает значение.Как это компилируется?
  • Вы уверены, что неожиданные результаты вызваны геттером / сеттером?У вас есть небольшая тестовая программа для демонстрации проблемы?

РЕДАКТИРОВАТЬ: Теперь, когда вы разместили свой код, я бы предположил, что что-то топтает ваши переменные.Какой компилятор вы используете?Точка останова памяти была бы самым быстрым способом рассказать вам, что происходит.Предполагая, что это не вариант, добавьте в свой код отладочный вывод, в котором показано текущее значение переменной, и делайте и захватывайте, пока не узнаете, где она растоптана.

Кроме того, новый код, который вы опубликовали, все еще нене демонстрирует никакого фактического использования.Простая программа тестирования поможет.

6 голосов
/ 15 октября 2010
 int setID(int id) { this->id = id; }

следует заменить на

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

И вы должны объявить конструктор для инициализации значения id.

3 голосов
/ 15 октября 2010

Убедитесь, что вы инициализируете id в конструкторе. Тем не менее, не создавайте слепо средства доступа. Когда вы добавляете код, всегда осознанно знайте, что для этого есть веская причина.

3 голосов
/ 15 октября 2010

Вы должны инициализировать int id с 0

2 голосов
/ 15 октября 2010

это не будет / не должно компилироваться. Ваш сеттер должен иметь тип возврата 'void'.

1 голос
/ 16 октября 2010

Мой хрустальный шар (и правка EboMike) говорит:

Вы перезаписываете connFD в вашем void setUdpAddress(short port, char * serverIP);.Вы должны использовать sockaddr вместо sockaddr_in.Ваши счастливые номера 3, 27 и 0x4f.

1 голос
/ 15 октября 2010
int getID() {   return id; }

Это нормально, но оно должно быть постоянным:

int getID() const {   return id; }


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

Это не должно возвращать значение:

void setID(int id) { this->id = id; }
0 голосов
/ 16 октября 2010

Внутри вашего:

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

Почему вы предполагаете, что "id" также не является участником?Ты не можешь.Это также верно:

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

Могу поспорить, что вы присваиваете (неинициализированной) переменной значение, которое она уже имеет.Примечание: я обычно рекомендую НЕ размещать «это» везде.Это должно быть очевидно, когда вы вызываете член (функцию или данные) или локальную переменную (при условии, что у вас нет глобальных переменных;)

0 голосов
/ 16 октября 2010

Интересно, вы получаете неожиданные результаты, потому что вы не инициализировали id. Когда вы создаете экземпляр своего класса, значение id неинициализируется. C ++ не устанавливается в ноль по умолчанию. Следовательно, если бы вы звонили getID() до того, как позвоните setID(), вы получите непредсказуемые результаты.

Вот пересмотренная версия вашего класса, которая правильно инициализирует id, помечает получатель как const и удаляет ненужное возвращаемое значение из установщика. Я также использовал общее соглашение о добавлении подчеркивания (_) к закрытым переменным-членам. Это просто вопрос личных предпочтений.

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; }
};
0 голосов
/ 15 октября 2010

Ваш код для меня выглядит (и работает) правильно:

#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
...