Доступ к значениям, созданным во время конструктора - C ++ - PullRequest
0 голосов
/ 04 июля 2018

У меня сегодня вопрос о доступе к переменным, значения которых создаются во время перегруженного конструктора. Функции, которые у меня есть, возвращают переменную, которой предшествует либо i (int), либо ch (char).

Я пытаюсь использовать строку вроде std :: cout << FCalc.GetUserNum1 (); в другой функции, чтобы напечатать правильное значение. Теперь, когда у меня есть это, я могу сделать это из своего основного, но я не могу сделать это из других функций. </p>

void vCalcNum();
char chGetUserOperation();
int iGetUserNum1();
int iGetUserNum2();
void vTestFunction();

FCalc FCalculate;
int main() 
{
    vCalcNum();
    //Overloaded constructor (Int, Int, Char) Each function returns variable
    FCalc FCalc(iGetUserNum2(), iGetUserNum1(), chGetUserOperation());
    std::cout << FCalc.GetUserNum1(); //cout prints proper value to console 


    sayUserOperation();
    return 0;

} 


void sayUserOperation()
{
    std::cout << FCalc.GetUserOperation(); 
    //This is where I am having trouble reffrencing GetUserOperation.
    // Class and getters are located in another file - can update if code is 
    //needed I have tried variants such as FCalculate.GetUserOperation() 
    //which returns nothing
}




//Edit to add FCalc.h source code

class FCalc
{
public:
    FCalc(); //constructor

    FCalc(int, int, char); //overlaoded constructor

    ~FCalc(); //destructor

    char GetUserOperation() const;
    int GetUserNum1() const;
    int GetUserNum2() const;


private:

    int NewUserNum1;
    int NewUserNum2;
    char NewUserOperation;




};

//edited to add FCalc.cpp source code
    #pragma once
#include "FCalc.h"
#include <iostream> 
#include <iomanip>
#include <string>


char FCalc::GetUserOperation() const {return NewUserOperation;}
int FCalc::GetUserNum1() const { return NewUserNum1;}
int FCalc::GetUserNum2() const { return NewUserNum2;}

FCalc::FCalc()
{
    int UserNum1 = 0;
    int UserNum2 = 0;
    char UserOperation;
}

FCalc::FCalc(int UserNum2, int UserNum1, char UserOperation)
{
    NewUserNum1 = UserNum1;
    NewUserNum2 = UserNum2;
    NewUserOperation = UserOperation;
}
FCalc::~FCalc() {}

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Вы должны передать объект FCalc в качестве аргумента функции void sayUserOperation(). Я думаю, что вы создали глобальный объект для использования FCalc FCalculate.

void sayUserOperation()
{
     std::cout << FCalculate.GetUserOperation(); 
}

Иначе, измените сигнатуру функции на:

void sayUserOperation(const FCalc &obj) //Send object as reference and use it
{
    std::cout << obj.GetUserOperation(); 
}
0 голосов
/ 04 июля 2018

В классе вы можете иметь методы, которые принадлежат экземпляру или вы можете иметь статические функции, которые не зависят от экземпляр, т.е. не имеет указателя "this".

Когда вы пишете FCalc.GetUserOperation (), вы не согласны, либо пиши

FCalc foo(...)
auto ch = foo.GetUserOperation(); // calling the method on the instance foo

или объявить GetUserOperation статический

static char GetUserOperation();
...
auto ch = FCalc::GetUserOperation();

Ваш конструктор по умолчанию FCalc неверен, вы объявляете локальные переменные и затем инициализируйте их там, они перестают существовать, как только конструктор остается.

Вместо этого вы могли бы написать что-то вроде (до C ++ 11)

FCalc::FCalc()
: NewUserNum1(0)
, NewUserNum2(0)
, NewUserOperation(0);
{}

аналогичным образом вы можете написать другой конструктор как

FCalc::FCalc(int UserNum2, int UserNum1, char UserOperation)
: NewUserNum1(UserNum1)
, NewUserNum2(UserNum2)
, NewUserOperation(UserOperation);
{}

Как правило, переменные-члены объявляются с префиксом m_ или _ чтобы было легче увидеть, что это переменная экземпляра и есть заглавные буквы для типов, но это только мой предпочтение.

Избегайте также объявлять глобальные экземпляры ваших классов, это было бы Достаточно в вашей главной, чтобы объявить экземпляр

FCalc foo(iGetUserNum2(), iGetUserNum1(), chGetUserOperation());

и затем передать его пользователю UserOperation

sayUserOperation(foo);

объявив функцию как

void sayUserOperation(FCalc& f)
{
 ...
 auto ch = f.GetUserOperation();
}
0 голосов
/ 04 июля 2018

Ваш код определяет класс FCalc. Он также определяет два объекта этого класса, FCalculate (глобальный) и FCalc (локальный в main), которые путанно называют так же, как и класс.

Если вы хотите получить доступ к переменной в функции, переменная должна быть либо глобальной, либо передаваться в качестве аргумента функции. (Это ничего особенного в объектах.)

Ваш main не передает свою локальную переменную FCalc в sayUserOperation, поэтому sayUserOperation не может получить к ней доступ. (Вместо этого он видит класс с именем FCalc, но это вам не поможет.)

Вот один из способов сделать это:

void sayUserOperation(const FCalc &x)
{
    std::cout << x.GetUserOperation() << '\n'; 
}

int main() 
{
    vCalcNum();
    FCalc calc(iGetUserNum2(), iGetUserNum1(), chGetUserOperation());
    std::cout << calc.GetUserNum1() << '\n';
    sayUserOperation(calc);
} 

Причина, по которой FCalculate.GetUserOperation() не делает ничего полезного, заключается в том, что, хотя переменная FCalculate доступна, ее содержимое не инициализируется. В частности:

FCalc::FCalc()
{
    int UserNum1 = 0;
    int UserNum2 = 0;
    char UserOperation;
}

Ваш конструктор по умолчанию объявляет несколько локальных переменных, но ничего с ними не делает. Он также не устанавливает NewUserNum1, NewUserNum2 или NewUserOperation (переменные-члены со странным названием).

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