2014-09-11 2 views
0
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 к ложному при запуске. значения, установленные в Boolean :: exec(), будут перезаписаны, если мне нужен новый экземпляр Boolean.

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

так что самое лучшее решение для объявления bool 'false' и сохранить 'true', если оно установлено?

+2

Я честно признаю, что вопрос не имеет для меня никакого смысла. Вы хотите использовать только один экземпляр 'Boolean'? – raina77ow

+0

Я не совсем понимаю, чего вы пытаетесь достичь; вы можете ввести конструктор, который принимает два аргумента 'bool', поэтому вы можете указать их при создании. 'exec1' изменяет состояние соответствующего экземпляра,' exec2' - нет. Пожалуйста, предоставьте больше информации о том, что такое желаемое поведение. – Codor

+0

второй экземпляр Boolean был предназначен только для вызова конструктора по умолчанию. в общем проекте Я бы использовал другой экземпляр Boolean в другом .cpp файле, например. То, что я пытаюсь достичь, это что-то вроде: установить bool в false при запуске, если строка найдена в файле .txt, установите bool в true, метод другого класса проверяет true или false и делает соответствующие вычисления – 2014-09-11 08:44:19

ответ

2

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

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

boolean.h:

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

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

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

EDIT: обратите внимание, что все экземпляры Boolean теперь разделяют эти переменные.

+1

Это единственное, что я мог понять, что ПП пытается достичь. – WhozCraig

+0

@ Спасибо, я обновил ответ. –

+0

Да, спасибо, что я пытался достичь. извините за то, что меня слишком вводят в заблуждение. Я уже пробовал устанавливать bool в static, но не смог скомпилировать их из-за добавления их в функцию Boolean :: exec(). должны были объявить их снаружи с самого начала. приветствия! – 2014-09-11 08:59:05

0

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

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

// cotr

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

// ctor implementaion

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

Это хорошая привычка инициализировать переменные-члены в списках инициализаторов конструктора, а не в теле конструктора. –

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 быть инициализирована ложным , затем установите их в true в одном булевом экземпляре, но не сбросите их в false в новом экземпляре Boolean, это означает, что вам нужны статические переменные.

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

 Смежные вопросы

  • Нет связанных вопросов^_^