简体   繁体   English

如何组织包含模板和朋友混合的类?

[英]How to organize classes containing mixture of templates and friends?

I have two C++ classes such that: 我有两个这样的C ++类:

  1. The first class contains a pointer to the second class and has template function that calls second class's public method through a pointer. 第一类包含指向第二类的指针,并具有通过指针调用第二类的public方法的模板函数。 The function is defined already in the class declaration, for the reason of being a template. 由于是模板,因此该函数已在类声明中定义。
  2. The second class allows the first class to access its private members through friendship mechanism. 第二类允许第一类通过友谊机制访问其私有成员。

Given that, my question is: how do I organize the sources/headers/forward declarations for this situation? 鉴于此,我的问题是:如何组织这种情况的来源/标题/转发声明? Whatever I tried, it just doesn't compile to an object file. 无论我尝试什么,它都不会编译为目标文件。

One sequence is this: 一个序列是这样的:

class Class2;

class Class1
{
        Class2 * c2;
public:
        template<typename T> T DoSomething(T& X)
        {
                c2->Func();
                return X;
        };

        void FuncFromClass1();

};

class Class2
{
        int data;
public:
        Class2() : data(0) {};
        void Func();
        friend void Class1::FuncFromClass1();
};

void Class2::Func()
{
        int i;
}

void Class1::FuncFromClass1()
{
        int j;
        c2 = new Class2;
        c2->data = 1;
}

Barks invalid use of incomplete type 'class Class2' because it doesn't recognize c2->Func(); 禁止invalid use of incomplete type 'class Class2'因为它无法识别c2->Func(); . The other one is: 另一个是:

class Class1;

class Class2
{
        int data;
public:
        Class2() : data(0) {};
        void Func();
        friend void Class1::FuncFromClass1();
};

class Class1
{
        Class2 * c2;
public:
        template<typename T> T DoSomething(T& X)
        {
                c2->Func();
                return X;
        };

        void FuncFromClass1();

}; 

void Class2::Func()
{
        int i;
}

void Class1::FuncFromClass1()
{
        int j;
        c2 = new Class2;
        c2->data = 1;
}

Doesn't recognize friend void Class1::FuncFromClass1(); 无法识别friend void Class1::FuncFromClass1(); .

The compilation is tried as g++ -c -std=c++11 -Wall test.cpp . 尝试将其编译为g++ -c -std=c++11 -Wall test.cpp

Note I'd rather not make Class1 as entire friend, rather want to keep only one of its methods as a friend to Class2 , if at all possible. 注意,我不希望让Class1成为整个朋友,而是尽可能地仅将其方法之一作为Class2的朋友。

Also, I haven't tried the exact same example in Visual Studio in Windows, but saw an entirely isomorphic situation like the one described (within a bigger project) and no complaints came from VS as far as I recall. 另外,我还没有在Windows的Visual Studio中尝试过完全相同的示例,但是看到了一个完全同构的情况,如所描述的(在一个更大的项目中),据我所知,没有来自VS的抱怨。 Is it unique to g++? 它是g ++独有的吗?

Move the implementation of the member function template where definition of Class2 is known. 将成员函数模板的实现Class2已知Class2定义的位置。

class Class2;

class Class1
{
   private:
      Class2 * c2;
   public:

      // Delcare, don't define
      template<typename T> T DoSomething(T& X);

      void FuncFromClass1();

};

class Class2
{
   private:
      int data;
   public:
      Class2() : data(0) {};
      void Func();
      friend void Class1::FuncFromClass1();
};

// Define
template<typename T>
T Class1::DoSomething(T& X)
{
   c2->Func();
   return X;
};

Note that the proposed solution is simple if both classes are defined in one .h file. 请注意,如果两个类都在一个.h文件中定义,则建议的解决方案很简单。 If the classes are defined in separate .h files, things get a little bit more complex. 如果这些类是在单独的.h文件中定义的,则情况会变得有些复杂。 You'll have to make sure that the .h file where Class1::DoSomething() is defined is #include d in every .cpp file where you want to use Class1::DoSomething() . 您必须确保在要使用Class1::DoSomething()每个.cpp文件中,定义了Class1::DoSomething()的.h文件是#include d。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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