Класс C ++ не возвращает правильное значение моей частной переменной - PullRequest
1 голос
/ 18 октября 2011

Я пытаюсь заставить эту программу принять пользовательский ввод и поместить его в публичную функцию и назначить его для privateVariable, затем я хочу вернуть значение privateVariable в main () и вывести его на экран, но все, что он показывает, является значением неопределенного целого (-858993460). Какая логическая проблема у меня здесь?

#include <iostream>
#include <string>

using namespace std;

class MyClass
{

    private:
        int privateVariable;

    public:
        int userVariable;

    void setVariable(int userVariable)
    {  
        privateVariable = userVariable;             
    } 

    int getVariable()
    {
        return privateVariable;                     
    } 

};

int main()
{
    int userVariable;
    cin >> userVariable;

    MyClass object1;
    MyClass object2;

    object1.setVariable(userVariable);        
    object2.getVariable();                   

    cout << object2.getVariable();            

    system("PAUSE");

    return 0;
}

Ответы [ 3 ]

6 голосов
/ 18 октября 2011

Вы устанавливаете object1 и получаете от object2. object1 и object2 - разные объекты. Поскольку переменная в object2 не установлена, вы получаете значение мусора.

И я не вижу смысла в публичном userVariable в MyClass.

1 голос
/ 18 октября 2011

Вы не устанавливаете переменную.Вы звоните setVariable на object1 и getVariable на object2, поэтому член object1 остается неинициализированным.

object1.setVariable(5); // object1.privateVariable = 5
                        // object2.privateVariable -> still uninitialized
object2.getVariable();  // returns uninitialized variable

Чтобы это работало в зависимости от того, что вы хотите:

class MyClass
{
private:
   static int privateVariable;
//......
}

Таким образом, privateVariable будет членом класса, а не экземпляром.Это означает, что оно имеет одинаковое значение для всех экземпляров класса (и даже если экземпляры не были созданы).Это также означает, что вы можете сделать обе свои функции статическими:

class MyClass
{
private:
   static int privateVariable;
public:
   static void setVariable(int userVariable)
   {  
      privateVariable = userVariable;             
   } 

   static int getVariable()
   {
      return privateVariable;                     
   } 
};

и вызывать методы без экземпляров:

MyClass::setVariable(5); //MyClass.privateVariable = 5;
MyClass::getVariable(); //returns 5
object1.getVariable(); //returns also 5

Другой вариант, если вам не нужны статические члены, чтобы установить член для обоих объектов:

object1.setVariable(5); // object1.privateVariable = 5
                            // object2.privateVariable -> still uninitialized
object2.setVariable(5); //object2.privateVariable = 5
object2.getVariable();  // returns 5

Или вы можете определить конструктор и установить там переменную:

class MyClass
{
private:
   static int privateVariable;
//......
public:
   MyClass()
   {
      privateVariable = 5;
   }
}

При этом каждый создаваемый вами объект будет иметьэлемент инициализирован до 5.

0 голосов
/ 18 октября 2011

object2 не инициализирует вашу переменную, так как вы установили ее для object1, код, который вы опубликовали, будет работать, только если privateVariable был статическим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...