从C ++中不同类的成员函数访问数据

时间:2014-10-28 03:17:23

标签: c++

我很困惑如何从不同的类实现数据成员访问。 我在三个不同的头文件中有三个类。

A.h
#include "B.h"
#include "C.h"
class A{

    B *b;
    friend void dataaccess_b_from_class_A(int a);
}

B.h
class B{

}

C.h
class C{

   void dataaccess_b_from_class_A(int a);
}
void C::dataaccess_b_from_class_A(int a)
{
   b = new B(); //I got error as symbol b could not be resolved.
}

我喜欢来自dataaccess_b_from_class_A()的{​​{1}}访问数据class C的{​​{1}}方法。 我把朋友函数放在B *b里面,但我得到了Class A。我该如何实现呢?

EDIT1: 根据讨论'gmas80', 我做的是

class A

如果我不包含静态,我得到b error as symbol b could not be resolved。 如果我包含静态,我得到class B; // forward declaration class A{ public: A(){}; private: static B* b; // since in the dataaccess_to_class_A you are using new friend class C; // this make b and dataaccess_from_class_C accessible }; class B{ public: B(){ cout << "B" << endl; }; // add content }; class C{ public: // you need this keyword if you want to call this function from outside void dataaccess_to_class_A(A a); }; void C::dataaccess_to_class_A(A a) { A::b = new B(); //Error as undefined reference to class A::b cout << "C" << endl; // test if called } 。 感谢

2 个答案:

答案 0 :(得分:1)

你在一小段代码中包含了很多错误!为什么不开始简单?这是一个编译的代码的修改单文件版本:

#include <iostream>
using namespace std;

class B; // forward declaration

class A{
public:
    A(){};
private:
    B* b; // since in the dataaccess_to_class_A you are using new
    void dataaccess_from_class_C(){ cout << "A" << endl; }; // test if called
    friend class C; // this make b and dataaccess_from_class_C accessible
};

class B{
public:
    B(){ cout << "B" << endl; };
   // add content
};

class C{
public: // you need this keyword if you want to call this function from outside
   void dataaccess_to_class_A(A a);
};

void C::dataaccess_to_class_A(A a)
{
   a.b = new B(); // this is a potentially memory leak if you will not delete in somehow
   a.dataaccess_from_class_C();
   cout << "C" << endl; // test if called
}

// it is better if you post runnable code
int main() {
    C c;
    A a;
    c.dataaccess_to_class_A(a);
}

编辑后

现在您可以开始在头文件中移动类,但是您需要添加监护人以避免多个定义..

A.H

#ifndef H_GUARDIAN_A
#define H_GUARDIAN_A

#include <iostream>
using namespace std;

class B; // forward declaration

class A
{
public:
    A()
    {};
private:
    B* b; // since in the dataaccess_to_class_A you are using new
    void dataaccess_from_class_C()
    {
        cout << "A" << endl;
    }; // test if called
    friend class C; // this make b and dataaccess_from_class_C accessible
};

class B
{
public:
    B()
    {
        cout << "B" << endl;
    };
    // add content
};

class C
{
public: // you need this keyword if you want to call this function from outside
    void dataaccess_to_class_A( A a );
};

void C::dataaccess_to_class_A( A a )
{
    a.b = new B(); // this is a potentially memory leak if you will not delete in somehow
    a.dataaccess_from_class_C();
    cout << "C" << endl; // test if called
}

#endif

的main.cpp

#include "a.h"

// it is better if you post runnable code
int main()
{
    C c;
    A a;
    c.dataaccess_to_class_A( a );
}

对你有意义吗?我简单地将类声明移动到另一个包含的文件中。

<强> EDIT2

现在我们将类定义拆分为三个不同的标题..

A.H

#ifndef H_GUARDIAN_A
#define H_GUARDIAN_A

#include <iostream>
using namespace std;

class B;

class A
{
public:
    A(): b(NULL){}; // initialize to NULL the b pointer
    ~A(); // new entry: destructor to eventually delete b (only member function declaration)
private:
    B* b; // since in the dataaccess_to_class_A you are using new
    void dataaccess_from_class_C()
    {
        cout << "A" << endl; // test if called
    }; 
    friend class C; // this make b and dataaccess_from_class_C accessible
};

#endif

a.cpp //新条目!它避免了循环依赖..析构函数在这里定义

#include "a.h"
#include "b.h"

A::~A() // destructor that eventually clean memory for b
{
    if( b ) delete b;
}

b.h

#ifndef H_GUARDIAN_B
#define H_GUARDIAN_B

#include "a.h"

class B
{
public:
    B()
    {
        cout << "B" << endl;
    };
    // add content
};

#endif

c.h

#ifndef H_GUARDIAN_C
#define H_GUARDIAN_C

#include "b.h"

class C
{
public: // you need this keyword if you want to call this function from outside

    void dataaccess_to_class_A( A a );
};

void C::dataaccess_to_class_A( A a )
{
    a.b = new B(); // this is a potentially memory leak if you will not delete in somehow
    a.dataaccess_from_class_C();
    cout << "C" << endl; // test if called
}

#endif

的main.cpp

#include "c.h"

// it is better if you post runnable code
int main()
{
    C c;
    A a;
    c.dataaccess_to_class_A( a );
}

答案 1 :(得分:0)

添加

include "B.h"

在开头如果C.h 并定义b的类型

B b( new B() );

另外,在freind声明中指定完全限定的方法:

friend void C::dataaccess_b_from_class_A(int a);

将C.h纳入A.h, 并且不要忘记在每个标题中包含警戒

另一点。为什么在头文件中定义C :: dataaccess_b_from_class_A?我建议在一个单独的文件中这样做。说,“C.cpp”。