Как создать глобальный экземпляр класса изнутри функции? - PullRequest
0 голосов
/ 18 июня 2019

Я ищу способ создания нового экземпляра класса при вызове функции, но все еще имею доступ к объекту внутри других функций.

Я думал о создании экземпляра класса внутриmain () и перезаписывает его изнутри функции, но, похоже, он ничего не делает при запуске кода.

Этот код представляет собой то, чего я хочу достичь.

#include <iostream>

class Account {
    private:
        int a;
    public:
        int b;
};

void createAccount(){
    // i want to create a class instance under certain conditions (function 
    //invoked)
    Account myAccount();
};

void getAccountInt(){
    //and access the newly created instance here in some way
    std::cout << myAccount.b << endl;
};

int main(){
    return 0;
}

Я плохо спрашиваю о таких вещах, это лучший пример, который я могу придумать.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Ваша функция, кажется, там, чтобы решить, хотите ли вы создать учетную запись (baesd на ваших комментариях). В этом случае это не должно фактически создавать это. Вам просто нужно принять решение, на которое может реагировать ваш код.

#include <iostream>

class Account {
private:
    int b;
public:
    Account() : b(0) {};
    int getAccountInt() const { return b; }
};

bool shouldCreateAccount() {
    return true; // you handle the decision here
}

int main() {
    if (shouldCreateAccount()) {
        Account myAccount;
        std::cout << myAccount.getAccountInt() << std::endl;
    }
    return 0;
}

Более общий принцип: https://en.cppreference.com/w/cpp/language/raii Если есть объект Account, он должен быть действительным. Обратите внимание, что если мы решим создать учетную запись, у нас есть такая, и если мы не решим создать учетную запись, там ничего нет. Это будет иметь больше смысла, когда вы охватите «область действия».

Мое мнение о том, почему ваш код не работает, заключается в том, что вы пытались создать учетную запись, когда не было действительной учетной записи, что нарушало RAII. Хотя иногда у меня странный взгляд на вещи.

0 голосов
/ 18 июня 2019

Вы можете создать глобальный экземпляр отложенным способом с помощью синглтона Скотта Мейера.Это будет работать, но это сомнительный дизайн:

auto global_account() -> Account& {
    static auto account = Account{};
    return account;
}

void create_account() {
    auto& account = global_account();
    // set account stuff
};

void get_account_int() {
    auto& account = global_account();
    std::cout << account.b << std::endl;
};

Но правильным решением было бы передать учетную запись функции, которая нуждается в ней из вашей основной или другой функции:

auto create_account() -> Account {
    auto account = Account{};
    // set account stuff
    return account;
};

void get_account_int(Account& account) {
    std::cout << account.b << std::endl;
};

auto main() -> int {
    auto account = create_account();
    auto acc_int = get_account_int(account);
}
...