проблемы с объявлением bool false в классе

boolean.cpp:
Boolean::Boolean() : test1(false),test2(false)
{
}

void Boolean::exec() {
test1 = true;
test2 = true;
if ((!test1) && (!test2))
std::cout << "both test1 && test2 are false" << std::endl;
else
std::cout << "test1 is " << test1 << " test2 is " << test2 << std::endl;
}

void Boolean::exec2() {
if ((!test1) && (!test2))
std::cout << "both test1 && test2 are false" << std::endl;
else
std::cout << "test1 is " << test1 << " test2 is " << test2 << std::endl;
}

boolean.h:
class Boolean {
private:
bool test1;
bool test2;

public:
Boolean();
void exec();
void exec2();
};

main.cpp:
int main(int argc, char *argv[]) {
Boolean start;
start.exec();
Boolean start2;
start2.exec2();
}

выход:

test1 is 1 test2 is 1
both test1 & test2 are false

если я использую конструктор по умолчанию, чтобы установить test1 и test2 в false при запуске.
значения, установленные в Boolean :: exec (), перезаписываются, если мне нужен новый экземпляр Boolean.

bool test1 = false; объявление не допускается в классе.
без конструктора по умолчанию значения bool не инициализируются.

так, каково лучшее решение объявить bool ‘false’ и оставить ‘true’, если оно установлено?

0

Решение

Вы объявляете два экземпляра Boolean, они занимают две разные области памяти, поэтому вы испытываете нормальное поведение

Если вы хотите, чтобы два экземпляра совместно использовали переменные, объявите переменные статическими

class Boolean {
private:
static bool test1;
static bool test2;

определить их в

Boolean::test1 = false;
Boolean::test2 = false;

РЕДАКТИРОВАТЬ: обратите внимание, что все экземпляры Boolean теперь будут совместно использовать эти переменные.

2

Другие решения

Я предполагаю, что вы не хотите инициализировать их с «false» по умолчанию, но они должны иметь некоторые значения по умолчанию.

Вы можете использовать аргумент по умолчанию ctor, чтобы при создании нового экземпляра иметь возможность установить значение, если оно не установлено, то будут установлены значения по умолчанию.

// cotr

Boolean(bool test1Val = false, bool test2Val = false);

// ctor implementaion

Boolen::Boolean(bool test1Val, bool test2Val) {
test1 = test1Val;
test2 = test2Val;
}
0

Поведение, которое вы наблюдаете, совершенно определено. Вы предоставляете конструктор по умолчанию для вашего класса Boolean который инициализирует ложные оба атрибута test1 а также test2,

Boolean start; // -> calls Boolean::Boolean() thus start.test1 == start.test2 == false
start.exec(); // Sets start.test1 and start.test2 to true
Boolean start2; // -> calls Boolean::Boolean() thus
// start2.test1 == start2.test2 == false
start2.exec2(); // Nothing done to start2.test1/2 => they are still false.

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

Вот очевидный метод установки для вашего класса:

void Boolean::setTests(bool t1, bool t2) {
test1 = t1;
test2 = t2;
}

В вашей основной функции вам просто нужно сделать:

Boolean start;
start.setTests(true, false); // or whatever
0

Если вы хотите, чтобы test1 и test2 были инициализированы как false, установите для них значение true в одном логическом экземпляре, но не сбрасывайте их до false в новом логическом экземпляре, то есть вам нужны статические переменные.

boolean.h:
class Boolean {
private:
static bool test1;
static bool test2;

public:
Boolean();
void exec();
void exec2();
};

boolean.cpp:
bool Boolean::test1 = false;
bool Boolean::test2 = false;

void Boolean::exec() {
Boolean::test1 = true;
Boolean::test2 = true;
if ((!test1) && (!test2))
std::cout << "both test1 && test2 are false" << std::endl;
else
std::cout << "test1 is " << test1 << " test2 is " << test2 << std::endl;
}

void Boolean::exec2() {
if ((!test1) && (!test2))
std::cout << "both test1 && test2 are false" << std::endl;
else
std::cout << "test1 is " << test1 << " test2 is " << test2 << std::endl;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector