简体   繁体   中英

C++ - Private variables in classes

I am trying to create a class in seperate files with private variables. So far my classes code is:

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

When I try to build in Code::Blocks it says:

  • ...\\TestClass.cpp: In function 'void set(std::string)':
  • ...\\TestClass.cpp:12: error: 'hi' was not declared in this scope
  • ...\\TestClass.cpp: In function 'void print(int)':
  • ...\\TestClass.cpp:17: error: 'hi' was not declared in this scope
  • ...\\TestClass.cpp:19: error: 'hi' was not declared in this scope
  • ...\\TestClass.cpp:21: error: 'hi' was not declared in this scope
  • ...\\TestClass.cpp:23: error: 'hi' was not declared in this scope

But when I run it (and don't build it) everything is working.

You forgot to write TestClass:: as shown below:

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

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

That is necessary so that compiler can know that set and print are member functions of class TestClass . And once you write it, making them member functions, they can acess the private members of the class.

Also, without TestClass:: , set and print function would become free functions.

Use

void TestClass::set(string x){

and

void TestClass::print(int x){

In your .cpp file, you need to make the set and print member functions explicitly part of the class, like:

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

You don't scope resolve your print and set functions with the class name.

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

say

void TestClass::set(string x){

instead of

void set(string x){

same for print(). You declared them as global functions instead of member functions of TestClass.

Your methods are not defined as methods of the class. Try using TestClass::set and TestClass::print.

-void set(string x) {
+void TestClass:set(string x) {

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM