假设我有这些抽象类,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)
进一步假设我有派生类ConcreteFoo和ConcreteBar.我想协同改进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++的一个缺点,我将不得不忍受或者是否真的有办法解决这个难题?
我有一个类方法返回对某事物的引用.当我使用这个方法时,如果我只有这个东西的前向声明,我只能编译,如果我分配方法的输出.我真的不明白为什么......
这是一个简化的例子:
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++ return-type return-value forward-declaration language-lawyer
我遇到了一个看似非常经典的问题:一个项目和一个集合类,它们都相互引用,需要一个前向声明.我正在使用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中看到他们的回答,上面提供的链接.
我正在为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)
我在网上找不到任何有用的东西.有任何想法吗?
以下代码在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) 我有以下代码,但编译器说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中转发枚举对我来说不起作用.我搜索了互联网和stackoverflow,但所有关于枚举器前向声明的问题都引用了c ++.你在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) 如何转发声明此对象:
@interface MyClass : NSObject <AVAudioSessionDelegate>
{
}
@end
Run Code Online (Sandbox Code Playgroud)
在目标c
c++ ×6
objective-c ×2
c ×1
class ×1
compilation ×1
covariance ×1
declaration ×1
delphi ×1
enumeration ×1
enums ×1
generics ×1
header ×1
import ×1
inheritance ×1
interface ×1
return-type ×1
return-value ×1
struct ×1