相关疑难解决方法(0)

什么是以非多态方式调用虚函数的成本?

我有一个纯粹的抽象基础和两个派生类:

struct B { virtual void foo() = 0; };
struct D1 : B { void foo() override { cout << "D1::foo()" << endl; } };
struct D2 : B { void foo() override { cout << "D1::foo()" << endl; } };
Run Code Online (Sandbox Code Playgroud)

foo在A点呼叫的成本是否与对非虚拟成员功能的呼叫相同?或者它是否比D1和D2不是从B派生的更昂贵?

int main() {
 D1 d1; D2 d2; 
 std::vector<B*> v = { &d1, &d2 };

 d1.foo(); d2.foo(); // Point A (polymorphism not necessary)
 for(auto&& i : v) i->foo(); // Polymorphism necessary.

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

答案:Andy Prowl …

c++ performance virtual-functions

9
推荐指数
2
解决办法
537
查看次数

C++多态性:从父类到子类

在C++中我们可以将子类指针转换为父类,但是有没有办法将它转换回来:从父类获得,从子类获得,给孩子类回来?

我的意思是:

class Parent
{
    ...
};

class Child : public Parent
{
    ...
};

int main(int argc, char const *argv[])
{
    Child* child = new Child();
    Parent* parent = child;
    Child* old_child = parent; // how to do this??
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢您的回答.

c++ oop polymorphism

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

你如何在Rust中声明一个接口?

我有多种类型的方法.我想通过编写一个接口来抽象它们,就像我在Java中一样:

public interface Shape {
    public float area();
}

class Circle implements Shape {
    public float area() {
        return radius * radius * Math.PI;
    }

    public float radius;
}
Run Code Online (Sandbox Code Playgroud)

但是,interfaceRust中没有关键字.Rust不提供抽象多种类型的可能性吗?

interface rust

8
推荐指数
1
解决办法
3482
查看次数

在c ++中有任何事件/代理/接口/通知!什么?

说我有这些类ViewA和ViewB

在目标C中使用委托模式我可以做到

@protocol ViewBDelegate{

- (void) doSomething();
}
Run Code Online (Sandbox Code Playgroud)

然后在ViewB界面中:

id<ViewBDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

然后在ViewA实现中我设置了委托:

viewB.delegate = self;
Run Code Online (Sandbox Code Playgroud)

现在我可以从viewB调用doSomething到任何未知类型的委托.

[delegate doSomething];
Run Code Online (Sandbox Code Playgroud)

"C++如何编程"是一个更糟糕的读物,无法找到演示基本设计模式的简单例子.

我在C++中寻找的是:

  • 事件 ActionScript和java
  • 或目标C中的代表或NSNotifications

任何允许A类,B类和C类知道ClassX didSomething()的东西!

谢谢

c++ callback signals-slots

7
推荐指数
2
解决办法
3368
查看次数

"程序到接口"是C++项目中的常见设计原则吗?

在过去的几天里,我读了很多关于"接口程序"和"控制反转"的内容.主要是在Java语言的上下文中.我的问题是它是否也是C++开发中的常见做法.有什么好处?有什么缺点?

是否值得申请小型项目(如15-20班)?

c++ oop inversion-of-control

4
推荐指数
2
解决办法
2859
查看次数

C ++中的Objective-C @protocol等效项

类A有一个类B的实例作为成员。有时B类的实例想和A类对话。在Objective-C中,我可以执行以下操作:

// A.h
@interface A : NSObject <BDelegate>
@property (nonatomic, retain) B *b;
@end 

// A.m
- (void) classBsays {

}


// B.h
@protocol BDelegate
- (void) classBsays;
@end

@interface B : NSObject
@property (nonatomic, assign) id<BDelegate> delegate;
@end

// B.m
@implementation B
- (void) f {
    [delegate classBsays];
}
@end
Run Code Online (Sandbox Code Playgroud)

我在C ++中使用类B上的void指针完成了类似的操作。但是,这漏掉了“类B的委托应实现此类方法”这一部分。

如何模仿C ++中的Objective-C协议?

c++ delegates objective-c

4
推荐指数
1
解决办法
1472
查看次数

接口如c ++中的java?

可能重复:
如何在C++中声明接口?

有人问我一个问题:"在C++中没有像java这样的接口.但事件那么你可以在c ++中实现它们,你会怎么做?"

怎么样?我会用虚方法创建一个类.这看起来像java中的接口或?

谢谢

c++ java interface

3
推荐指数
1
解决办法
7695
查看次数

在C ++中声明“接口”,并且不将其vtable传递给每个翻译单元

根据答案,在C ++中从概念上类似于接口的方式声明类的方法如下:

class IDemo
{
public:
    virtual ~IDemo() {}
    virtual void OverrideMe() = 0;
};
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,会收到警告:'IDemo' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit。是否有适当的方法在项目中使用此类接口而不用这些vtable污染每个翻译单元?

c++ inheritance abstract-class interface pure-virtual

3
推荐指数
1
解决办法
61
查看次数

Java"实现"c ++中的等价物?

我想创建一个优先级队列类,我可以在不同的程序中一次又一次地重复使用,它只存储一个类型/类.

我可以通过使用compareTo方法阻止任何其他类型/类进入队列,但这意味着队列类应该在进入队列的所有类型/类中都需要compareTo方法.

我知道在Java中,您可以使类实现Comparable以确保该类实现compareTo方法.所以我想知道c ++中是否有类似的东西.

同样,我不能使用模板,所以,任何替代品将不胜感激.模板不受限制的原因我也不知道,要求这个程序的人不会对此有所了解.它也必须纯粹是我自己的优先级队列代码.

c++ code-reuse

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

接口的解决方法

在C++中,我如何声明一个接口,我可以使用它,如下所示:

/** Enemy "Interface" */
Class Enemy {
    Enemy();
    virtual ~Enemy();
    virtual void doStuff() = 0;
};

/** Enemy of type 1 */
Class Enemy_type1 : public Enemy {
    Enemy_type1();
    virtual ~Enemy_type1();
    virtual void doStuff() {
        // different for every type of enemy
    }
};

/** Add an enemy to EnemyManager */
void EnemyManager::addEnemy(Enemy * e) {
    this->enemies.push_back(*e); // declared as vector<Enemy> enemies;
}
Run Code Online (Sandbox Code Playgroud)

c++ inheritance interface

0
推荐指数
1
解决办法
118
查看次数