gpt4 book ai didi

c++ - 行为根据它所链接的类而改变的程序

转载 作者:行者123 更新时间:2023-11-30 05:44:26 31 4
gpt4 key购买 nike

我认为我尝试的东西不够花哨,配得上“插件”这个词,但我想做的是:

给定文件 a.h、a.cpp 和 main.cpp,我想创建其他文件,例如:

g++ -o test main.cpp a.cpp b.cpp

导致测试程序执行某些操作,并且

g++ -o test main.cpp a.cpp c.cpp

做其他事情。

这部分我已经在工作了,请参见下面的代码。我的问题是:有没有可能

 g++ -o test main.cpp a.cpp

做一些默认行为?我尝试了几件事,但总是以未定义的方式结束。

我目前的代码:

// a.h    

#ifndef A_H_
#define A_H_

class A {
public:
A();
~A();
virtual void print()=0;
};

#endif


// a.cpp

#include <iostream>
#include "a.h"

A::A(){}
A::~A(){}


// b.h

#include "a.h"

class B: public A {
public:
B();
~B();
void print();
};


// b.cpp

#include <iostream>
#include "b.h"

B::B(){}
B::~B(){}
void B::print(){
std::cout << "I am B" << std::endl;
}

A* a = new B();


// code in c.h and c.cpp similar to the one in b.h and b.cpp
// just "B" replaced by "C"

// main.cpp

#include "a.h"

extern A* a;

int main(){
a->print();
}

针对 b.cpp 编译时,代码打印“I am B”,针对 c.cpp 编译时,代码打印“I am C”。

我愿意:

g++ -o test main.cpp a.cpp

让测试要么什么都不做,要么做一个默认行为。不需要简单。

最佳答案

这是一个使用弱符号的(不可移植的)选项。

啊.h

struct A {
public:
virtual void print() = 0;
};

struct Dummy: A {
void print() override {};
};

A* init();

main.cpp

#include "a.h"

A* __attribute__((weak)) init()
{
return new Dummy;
}

int main()
{
A* a = init();
a->print();
}

b.cpp

#include "a.h"
#include <iostream>

struct B: A
{
void print() override {
std::cout << "B" << std::endl;
}
};

A* init()
{
return new B;
}

如果您不链接 b.cpp 或提供 init 函数的任何其他实体,则 main.cpp 中的那个将会被使用。如果您使用 b.cpp 链接,将使用那个定义。

这为 init 函数提供了一个“默认实现”,并允许您通过不使用全局变量来管理初始化(这里不重要,但是一旦您充实了您的插件系统就会变得更加棘手).

关于c++ - 行为根据它所链接的类而改变的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29862860/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com