C++でメンバ変数をprivateにして、特定のクラスにだけ公開するようにクラスをfriend指定したのですがprivateメンバにアクセスできませんとエラーが吐かれてしまいます。
先行宣言したりもしてみたのですがどうしても使用できません。
何か心当たりのあるかた教えてください。
class A
{
friend class B;
private:
int a;
};
class B
{
public:
void test( A *a )
{
a->a = 0;
}
};
コードは違いますがこんな感じのことをしたいのです。
/*
コンソールで小さなプログラムでテストしてみると動くのにいざ実際のソースに組み込むと動かないという奇妙な状態です。よろしくお願いします。
*/
No.6ベストアンサー
- 回答日時:
こんにちは。
御礼頂き有難うございます。以下でコンパイルに通りました。
namespace NS1
{
namespace NS2
{
class B;
}
}
namespace NS1
{
namespace NS2
{
namespace NS3
{
class A
{
friend class NS1::NS2::B;//ココでは?
private:
int num;
};
}
}
}
namespace NS1
{
namespace NS2
{
class B
{
public:
void test( NS3::A *a )
{
a->num = 0;
}
};
}
}
回答ありがとうございます。
提示していただいたソースでやっとこさコンパイルが通ってくれました。
今回は丁寧に何度もソースを書いていただいたり、深く追求してくださったりしてありがとうございました。
重ねてお礼申し上げます。
ありがとうございました。
No.4
- 回答日時:
こんにちは。
補足いただきました。>>namespaceのせいで名前間違いが発生しているのかと思い確認してみたのですがどうも違うようです。
namespaceを使用していますか。でしたら、以下のどちらか。
------------------------------------------------------------
クラスAのみネームスペース内にある。
class B;//此れが無いと駄目
namespace NSA
{
class A
{
friend class B;
private:
int a;
};
};//namespace NSA
class B
{
public:
void test( NSA::A *a )
{
a->a = 0;
}
};
------------------------------------------------------------
クラスA、クラスBとも別のネームスペース内にある時。
namespace NSB//此れが無いと駄目
{
class B;
};//namespace NSB
namespace NSA
{
class A
{
friend class NSB::B;
private:
int a;
};
};//namespace NSA
namespace NSB
{
class B
{
public:
void test( NSA::A *a )
{
a->a = 0;
}
};
};//namespace NSB
------------------------------------------------------------
これでも無理であるならば、私はギブアップです、すんません。
事細かに説明していただき本当にありがとうございます。
namespace NS1
{
namespace NS2
{
namespace NS3
{
class A
{
friend class B;
private:
int num;
};
}
}
}
namespace NS1
{
namespace NS2
{
class B
{
prublic:
void test( NS3::A *a )
{
a->num = 0;
}
};
}
}
ネームスペースの説明も不十分でしたね・・・。
とりあえず現在こんな感じのコードを書いてしまっています。
class Aとclass Bは違うヘッダーファイル内に記述していて、class Aのほうがclass Bの1個下のネームスペースに入っている感じです。
ご指摘のようにコードを変えて試行錯誤してみたのですがやはりprivateメンバにアクセスできないようです。
本当に丁寧にありがとうございます。
No.2
- 回答日時:
こんばんは。
補足いただきました。>>メンバ変数をpublicにするとアクセスできることからinclude抜けではないとおもうのですが。
friend class ???に指定したクラス名が間違ってはいませんでしょうか。
例えば、
class A
{
friend class BB;//ココ、名前が間違ってしまっている。
private://publicにすると通る
int a;
};
class B
{
public:
void test( A *a )
{
a->a = 0;
}
};
とか。又は、継承の断層で
class A
{
friend class I;
private://publicにすると通る
int a;
};
class I
{
virtual void test( A *a) = 0;//クラスBでオーバーライドする
};
class B : public I
{
public:
void test( A *a )//触ろうとする
{
a->a = 0;
}
};
この回答への補足
回答ありがとうございます。
すみません、publicでアクセスできるのは当たり前でした。今気づきました。
namespaceのせいで名前間違いが発生しているのかと思い確認してみたのですがどうも違うようです。
継承の問題でもなさそうです。
No.1
- 回答日時:
こんばんは。
クラスBを実装しているソースに、クラスBのヘッダーを確りとインクルードされていない可能性があります。
「'a' : privateメンバにアクセスできません」の他に「認識できない型'B'が使われています」が表示されていませんでしょうか?
再現するとすれば、以下の様な感じです。
//a.hppの中
//+-----------------------------------
#ifndef __A_HPP__
#define __A_HPP__
class A
{
friend class B;
private:
int a;
};
#endif
//-----------------------------------+
//b.hppの中
//+-----------------------------------
#ifndef __B_HPP__
#define __B_HPP__
class A;
class B
{
public:
void test( A *a );
};
#endif
//-----------------------------------+
//b.cppの中
//+-----------------------------------
#include"a.hpp"
#include"b.hpp"//ココをコメントアウトすると再現出来る
void B::test( A *a )
{
a->a = 0;
}
//-----------------------------------+
この回答への補足
回答ありがとうございます。
確認してみたところ「認識できない型'B'が使われています」は表示されていないようです。
メンバ変数をpublicにするとアクセスできることからinclude抜けではないとおもうのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C++ protectedにアクセス不可
C言語・C++・C#
-
privateなメンバ関数をテストする方法
C言語・C++・C#
-
派生クラスから基本クラスprotectedメンバへのアクセスについて
C言語・C++・C#
-
-
4
既定のコンストラクタがない?
C言語・C++・C#
-
5
c++ 文字列を入力して、一文字ずつ表示させる関数を作りたい
C言語・C++・C#
-
6
cout と cerrの違い
C言語・C++・C#
-
7
関数の実体定義にヘッダファイルの2重定義防止方法が効かない?
C言語・C++・C#
-
8
コンストラクタでnewを失敗した場合の対応について
C言語・C++・C#
-
9
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
10
作成したウインドウのサイズを固定するには?
C言語・C++・C#
-
11
C++にてtemplateで受け取った任意の型の変数が何型であるかを判定したい
C言語・C++・C#
-
12
2重定義って??
C言語・C++・C#
-
13
protectedなのにアクセスできないのは何故
PHP
-
14
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
15
スレッドの安全な終了のさせ方
C言語・C++・C#
-
16
Debug Assertion Failed?
C言語・C++・C#
-
17
newしないオブジェクトについて
C言語・C++・C#
-
18
error C3867 関数呼び出しには引数リスト
C言語・C++・C#
-
19
【C++】関数ポインタの使い方
C言語・C++・C#
-
20
C++ 構造体の一括初期化 {0}
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
a href="..." とServlet
-
範囲外の数値を代入したらエラ...
-
c++,ある関数のクラスから別の...
-
無名パッケージからのインポート
-
構造 他のクラスの構造体を別...
-
JTableのイベント取得方法
-
ネストしたenumへのリフレクシ...
-
型Containerのメソッドadd(S...
-
C#にて別クラスの関数を使いたい
-
C# インターフェイスの実装
-
C#のクラスライブラリでメッセ...
-
visual studioのデザイナ画面で...
-
ASP Pageの孫継承のPage_Load
-
親クラスから子クラスへアクセス。
-
java-別クラスの変数の使い方を...
-
Java インスタンス作成のイベ...
-
Javaでswingの画面変わる際に他...
-
【ASP.NET MVC3】共通ビュークラス
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
関数内の変数に<summary>コメン...
-
c++,ある関数のクラスから別の...
-
C#にて別クラスの関数を使いたい
-
java-別クラスの変数の使い方を...
-
C++でfriendクラスにしているの...
-
a href="..." とServlet
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
Java リフレクションについて
-
import と extends について
-
C#でほかのファイルにある自作...
-
C#のクラスライブラリでメッセ...
-
Java
-
アップキャスト、ダウンキャス...
-
無名パッケージからのインポート
-
違うクラスからの変数の共有化
-
SwingでgetContentPaneのエラー...
-
ひとつのファイルにクラスは1つ?
おすすめ情報