标签: forward-declaration

有没有办法转发声明协方差?

假设我有这些抽象类,Foo并且Bar:

class Foo;
class Bar;

class Foo
{
public:
  virtual Bar* bar() = 0;
};

class Bar
{
public:
  virtual Foo* foo() = 0;
};
Run Code Online (Sandbox Code Playgroud)

进一步假设我有派生类ConcreteFooConcreteBar.我想协同改进foo()和这样的bar()方法的返回类型:

class ConcreteFoo : public Foo
{
public:
  ConcreteBar* bar();
};

class ConcreteBar : public Bar
{
public:
  ConcreteFoo* foo();
};
Run Code Online (Sandbox Code Playgroud)

这将无法编译,因为我们心爱的单通道编译器不知道ConcreteBar将继承Bar,因此这ConcreteBar是一个完全合法的协变返回类型.普通的前向声明ConcreteBar也不起作用,因为它没有告诉编译器有关继承的任何信息.

这是C++的一个缺点,我将不得不忍受或者是否真的有办法解决这个难题?

c++ covariance forward-declaration

15
推荐指数
1
解决办法
2123
查看次数

返回对前向声明类型的引用(C++)

我有一个类方法返回对某事物的引用.当我使用这个方法时,如果我只有这个东西的前向声明,我只能编译,如果我分配方法的输出.我真的不明白为什么......

这是一个简化的例子:

ClassA.h:

//Forward declare
class ClassB;

class ClassA
{
public:
    ClassA(void);
    ~ClassA(void);

    ClassB& Func();
};
Run Code Online (Sandbox Code Playgroud)

ClassA.cpp:

#include "ClassA.h"

#include "ClassB.h"

ClassA::ClassA(void)
{}

ClassA::~ClassA(void)
{}

static ClassB c;

ClassB& ClassA::Func()
{
    return c;
}
Run Code Online (Sandbox Code Playgroud)

ClassB.h:

#pragma once
class ClassB
{
public:
    ClassB(void) {};
    ~ClassB(void) {};
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我在ClassA::Func没有分配返回值的情况下调用(虽然只有前向声明ClassB),它将无法编译:

main.cpp中:

#include "ClassA.h"

int main(void)
{
    ClassA a;

    a.Func(); //error C2027: use of undefined type 'ClassB'

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我改用这一行,它的工作原理是: ClassB& b = a.Func();

这里发生了什么事?ClassB当没有在任何地方分配返回值时,为什么编译器需要知道其方法的大小或方法?

我正在用VisualStudio 2010 …

c++ forward-declaration visual-studio

15
推荐指数
1
解决办法
414
查看次数

我的退货类型是否需要定义?

前向声明允许我们推迟定义实际类型直到实现文件.指针的头部或前向声明类型的引用允许这样做.

有人告诉我:

按值返回不需要类型定义.前瞻性声明就足够了

有人可以通过标准的实际报价来确认或否认这一点吗?我的印象是这不合法.

c++ return-type return-value forward-declaration language-lawyer

15
推荐指数
1
解决办法
1463
查看次数

如何在Delphi 2010下设置泛型类型的前向声明?

我遇到了一个看似非常经典的问题:一个项目和一个集合类,它们都相互引用,需要一个前向声明.我正在使用Delphi 2010和更新5.

这适用于非泛型类,但我无法解决泛型类型的E2086错误:

type
  // Forward declarations
  TMyElement = class; // E2086: Type 'TMyElement' is not yet completely defined

  TMyCollection<T:TMyElement> = class
    //
  end;

  TMyElement = class
    FParent: TMyCollection<TMyElement>;
  end;
Run Code Online (Sandbox Code Playgroud)

切换类声明顺序时会发生同样的问题.

我在这里或在QualityCentral中没有找到任何对此问题的引用(发现了E2086的其他问题,但与此用例无关)

我现在唯一的解决方法是将父项声明为TObject,并在需要时将其强制转换为集合泛型类型(不是一个干净的解决方案......)

您是如何解决此问题,或者向前声明您的泛型类的?

谢谢,

[编辑2011年10月22日]跟进QualityCentral: 我在这里报告了质量中心的这个错误

EMB最近已经关闭,其解决方案状态如下:解决方案:已设计已解决的内容:16.0.4152

我只有Delphi 2010.有人可以确认它已在Delphe XE2 Update1中修复,还是意味着它按预期工作?

[编辑2011年10月23日] EMB的最终答案: EMB今天证实,实际的Delphi编译器不支持使用泛型类型的前向声明.你可以在QC中看到他们的回答,上面提供的链接.

delphi generics forward-declaration

14
推荐指数
1
解决办法
4037
查看次数

"尝试在Cocos2d中使用前瞻性'游戏'作为'MathGame'的超类"

我正在为iphone制作Cocos2d游戏,我有我的主要游戏模式Game,它继承自CCLayer.

我正在尝试制作另一种游戏模式,MathGame它继承自Game,但是当我尝试编译时,我得到了以下错误MathGame.h:

尝试使用前瞻性"游戏"作为"MathGame"的超类

即使实现和接口为MathGame空,我也会收到错误.只有当我尝试包含MathGame.h在另一个文件中时才会发生这种情况.

这是Game类的代码:

// Game.h
#import "cocos2d.h"
#import <GameKit/GameKit.h>
#import "SplashScreenLayer.h"

@interface Game : CCLayer
    // A bunch of stuff
@end
Run Code Online (Sandbox Code Playgroud)

新游戏类型:

// MathGame.h
#import "Game.h"

@interface MathGame : Game
@end
Run Code Online (Sandbox Code Playgroud)

主菜单包括:

// SplashScreen.h
#import "cocos2d.h"
#import "Game.h"
#import "MathGame.h"
#import "HowToPlayLayer.h"
#import "AboutLayer.h"

@interface SplashScreenLayer : CCLayer
    // A bunch of stuff
@end
Run Code Online (Sandbox Code Playgroud)

我在网上找不到任何有用的东西.有任何想法吗?

import inheritance objective-c forward-declaration

14
推荐指数
1
解决办法
1万
查看次数

类的前向声明似乎在C++中不起作用

以下代码在VC++ 6中编译.我不明白为什么我得到C2079: 'b' uses undefined class 'B'以下代码的编译错误.

B类来源

#include "B.h"

void B::SomeFunction()
{
}
Run Code Online (Sandbox Code Playgroud)

B级标题

#include "A.h"

struct A;

class B
{
    public:
        A a;
        void SomeFunction();
};
Run Code Online (Sandbox Code Playgroud)

struct A Header

#include "B.h"

class B;

struct A
{
    B b;
};
Run Code Online (Sandbox Code Playgroud)

如果我将B类标题更改为以下内容,则不会出现错误.但标题声明不会在顶部!

具有奇怪标头声明的B类标头

struct A;

class B
{
     public:
        A a;
        void SomeFunction();
};

#include "A.h"
Run Code Online (Sandbox Code Playgroud)

c++ compilation header declaration forward-declaration

13
推荐指数
2
解决办法
1万
查看次数

struct forward声明编译失败

我有以下代码,但编译器说sender_wrapper是未定义的,即使我转发声明它.我可以不做结构的前向声明吗?(用VS2003编译)

struct send_wrapper;

struct IPSend
{
    IPSend::IPSend(const send_wrapper& sender) : _sender(sender) {}

    void IPSend::operator()(const std::string& msg)
    {           
        if (!msg.empty())
            _sender.send(msg);
    }

    send_wrapper _sender; //error C2079: 'IPSend::_sender' uses undefined struct 'send_wrapper'

};

struct send_wrapper 
{
std::auto_ptr<tcp_server> server;

};
Run Code Online (Sandbox Code Playgroud)

c++ struct forward-declaration

13
推荐指数
1
解决办法
2万
查看次数

C - 枚举的前向声明?

在C中转发枚举对我来说不起作用.我搜索了互联网和stackoverflow,但所有关于枚举器前向声明的问题都引用了c ++.你在C中声明枚举器怎么办?将它们放在每个文件的顶部(或包含在内),以便文件中的所有函数都可以访问它们?谢谢

c enums enumeration forward-declaration

13
推荐指数
2
解决办法
2万
查看次数

C++类前向声明

当我尝试编译此代码时,我得到:

52 C:\Dev-Cpp\Projektyyy\strategy\Tiles.h invalid use of undefined type `struct tile_tree_apple' 
46 C:\Dev-Cpp\Projektyyy\strategy\Tiles.h forward declaration of `struct tile_tree_apple' 
Run Code Online (Sandbox Code Playgroud)

我的代码的一部分:

class tile_tree_apple;

class tile_tree : public tile
{
      public:
          tile onDestroy() {return *new tile_grass;};
          tile tick() {if (rand()%20==0) return *new tile_tree_apple;};
          void onCreate() {health=rand()%5+4; type=TILET_TREE;};        
};

class tile_tree_apple : public tile
{
      public:
          tile onDestroy() {return *new tile_grass;};
          tile tick() {if (rand()%20==0) return *new tile_tree;};
          void onCreate() {health=rand()%5+4; type=TILET_TREE_APPLE;}; 
          tile onUse() {return *new tile_tree;};       
};
Run Code Online (Sandbox Code Playgroud)

我真的不知道该怎么做,我搜索了解决方案,但我找不到任何与我的问题相似的东西......实际上,我有更多的课程与父母"瓷砖",这是好的之前... Thanx任何帮助.

编辑:

我决定将所有返回的类型更改为指针以避免内存泄漏,但现在我得到了:

27 C:\Dev-Cpp\Projektyyy\strategy\Tiles.h ISO …
Run Code Online (Sandbox Code Playgroud)

c++ class forward-declaration

13
推荐指数
5
解决办法
12万
查看次数

objective-c接口的前向声明

如何转发声明此对象:

@interface MyClass : NSObject <AVAudioSessionDelegate>
{

}

@end
Run Code Online (Sandbox Code Playgroud)

在目标c

interface objective-c forward-declaration

13
推荐指数
1
解决办法
1万
查看次数