C ++ - Частные переменные в классах - PullRequest
9 голосов
/ 10 апреля 2011

Я пытаюсь создать класс в отдельных файлах с закрытыми переменными. Пока мой код занятий:

В TestClass.h

#ifndef TESTCLASS_H
#define TESTCLASS_H
#include <string>
using namespace std;

class TestClass
{
    private:
        string hi;
    public:
        TestClass(string x);
        void set(string x);
        void print(int x);
};

#endif

In TestClass.cpp

#include "TestClass.h"
#include <iostream>
#include <string>
using namespace std;

TestClass::TestClass(string x)
{
    cout << "constuct " << x << endl;
}

void set(string x){
    hi = x;
}

void print(int x){
    if(x == 2)
        cout << hi << " x = two\n";
    else if(x < -10)
        cout << hi << " x < -10\n";
    else if(x >= 10)
        cout << hi << " x >= 10\n";
    else
        cout << hi << " x = " << x << endl;
}

Когда я пытаюсь встроить Code :: Blocks, он говорит:

  • ... \ TestClass.cpp: В функции 'void set (std :: string)':
  • ... \ TestClass.cpp: 12: ошибка: 'hi' не был объявлен в этой области
  • ... \ TestClass.cpp: в функции 'void print (int)':
  • ... \ TestClass.cpp: 17: ошибка: 'hi' не был объявлен в этой области
  • ... \ TestClass.cpp: 19: ошибка: 'hi' не был объявлен в этой области
  • ... \ TestClass.cpp: 21: ошибка: 'hi' не был объявлен в этой области
  • ... \ TestClass.cpp: 23: ошибка: 'hi' не был объявлен в этой области

Но когда я запускаю его (и не собираю), все работает.

Ответы [ 7 ]

18 голосов
/ 10 апреля 2011

Вы забыли написать TestClass::, как показано ниже:

void TestClass::set(string x)
   //^^^^^^^^^^^this

void TestClass::print(int x)
   //^^^^^^^^^^^this

Это необходимо для того, чтобы компилятор мог знать, что set и print являются функциями-членами класса TestClass. И как только вы напишите это, сделав их членами-функциями, они смогут получить доступ к закрытым членам класса.

Кроме того, без функции TestClass :: , set и print станут свободными функциями.

4 голосов
/ 10 апреля 2011

Используйте

void TestClass::set(string x){

и

void TestClass::print(int x){
3 голосов
/ 10 апреля 2011

В вашем файле .cpp вам нужно явно сделать функции-члены set и print частью класса, например:

void TestClass::set(string x){
    hi = x;
}

void TestClass::print(int x){
    if(x == 2)
        cout << hi << " x = two\n";
    else if(x < -10)
        cout << hi << " x < -10\n";
    else if(x >= 10)
        cout << hi << " x >= 10\n";
    else
        cout << hi << " x = " << x << endl;
}
2 голосов
/ 10 апреля 2011

Вы не можете разрешить свои функции print и set с именем класса.

void TestClass::set(string x){
    hi = x;
}

void TestClass::print(int x){
    if(x == 2)
        cout << hi << " x = two\n";
    else if(x < -10)
        cout << hi << " x < -10\n";
    else if(x >= 10)
        cout << hi << " x >= 10\n";
    else
        cout << hi << " x = " << x << endl;
}
1 голос
/ 10 апреля 2011

1001 * говорят *

void TestClass::set(string x){

вместо

void set(string x){

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

0 голосов
/ 10 апреля 2011
-void set(string x) {
+void TestClass:set(string x) {
0 голосов
/ 10 апреля 2011

Ваши методы не определены как методы класса. Попробуйте использовать TestClass :: set и TestClass :: print.

...