【发布时间】:2021-12-25 13:20:27
【问题描述】:
我可能遗漏了一些基本的东西,但不确定要查找什么来找出什么。
我有一个希望返回的简单程序:
ImplA
ImplB
它实际上返回:
ImplA
ImplA
我知道在每个文件中重命名类“Do”,或者将类定义包装在命名空间中,可以解决这个问题,但是有没有办法让这两个文件的实现名称相同?是否有某种方法可以限制类对文件的可见性?
// main.cpp
#include "do_a.h"
#include "do_b.h"
#include <cstdint>
int32_t main(int32_t,char**) {
IDo* a = getImplA();
IDo* b = getImplB();
a->print();
b->print();
delete b;
delete a;
return 0;
}
// i_do.h
// interface file for DI
#pragma once
class IDo {
public:
virtual ~IDo() {}
virtual void print() = 0;
};
// do_a.h
#pragma once
#include "i_do.h"
IDo *getImplA();
// do_b.h
#pragma once
#include "i_do.h"
IDo *getImplB();
// do_a.cpp
#include "do_a.h"
#include <iostream>
namespace { // adding anon-namespace seems to be another alternative
class Do : public IDo {
public:
virtual void print() override {
std::cout << "ImplA" << std::endl;
}
};
}
IDo* getImplA() {
return new Do();
}
// do_b.cpp
#include "do_b.h"
#include <iostream>
namespace {
class Do : public IDo {
public:
virtual void print() override {
std::cout << "ImplB" << std::endl;
}
};
}
IDo* getImplB() {
return new Do();
}
cmake_minimum_required(VERSION 3.12)
# C++ version required
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS
"-std=gnu++2a -Wall -Wpedantic -Wextra -fexceptions -O0 -g3 ${CMAKE_CXX_FLAGS_DEBUG}"
)
project(main)
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(Main main)
set(MainSrc
main.cpp
)
set(ApplSrc
do_a.cpp
do_a.h
do_b.cpp
do_b.h
i_do.h
)
add_executable(${Main} ${ApplSrc} ${MainSrc})
编辑以包装类 Do {...};在匿名命名空间中。
【问题讨论】:
标签: c++ dependency-injection namespaces