web-dev-qa-db-ja.com

C ++-クラスのプライベート変数

プライベート変数を使用して、個別のファイルにクラスを作成しようとしています。これまでのところ、私のクラスコードは次のとおりです。

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

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」はこのスコープで宣言されていません

しかし、私がそれを実行するとき(そしてそれを構築しないとき)、すべてが機能しています。

9
Mr. Giggums

以下に示すように、TestClass::を書くのを忘れました。

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

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

これは、コンパイラがsetprintがクラスTestClassのメンバー関数であることを認識できるようにするために必要です。そして、それを記述してメンバー関数にすると、クラスのプライベートメンバーにアクセスできるようになります。

また、TestClass ::がないと、setおよびprint関数は無料の関数になります。

18
Nawaz

使用する

void TestClass::set(string x){

そして

void TestClass::print(int x){
4
EboMike

あなたの.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;
}
3
bgporter

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

いう

void TestClass::set(string x){

の代わりに

void set(string x){

print()についても同じです。 TestClassのメンバー関数ではなく、グローバル関数として宣言しました。

1
Adam

メソッドはクラスのメソッドとして定義されていません。 TestClass :: setとTestClass :: printを使用してみてください。

0
Achim