中午吃饭组里一个同事问的,折腾的一下午还是没搞定,牛皮吹大了,请教下大家如何解决,谢谢各位
基本需求是两个命名空间存在相同的一个类,TA/TB 以示区别
怎么将命令空间 A 中类 TA 的对象作为命名空间 B 中类 TB 构造函数的参数传入并访问其中的字段?
#include "stdafx.h"
#include <iostream>
using namespace std;
class B::TB;
namespace A
{
class TA
{
private:
char *m_pstr;
public:
TA(const char *cstr)
{
if (cstr == nullptr)
{
m_pstr = nullptr;
}
else
{
int len = strlen(cstr);
m_pstr = new (nothrow)char[len+1];
memcpy(m_pstr, cstr, len);
m_pstr[len] = '\0';
}
}
friend class B::TB;
};
}
namespace B
{
class TB
{
private:
char *m_pstr;
public:
TB(const char *cstr)
{
if (cstr == nullptr)
{
m_pstr = nullptr;
}
else
{
int len = strlen(cstr);
m_pstr = new (nothrow)char[len+1];
memcpy(m_pstr, cstr, len);
m_pstr[len] = '\0';
}
}
//friend class A::TA;
TB(const A::TA& ta)
{
this->m_pstr = ta.m_pstr;
}
~TB()
{
if (m_pstr != nullptr)
{
delete []m_pstr;
m_pstr = nullptr;
}
}
};
}
int main(int argc, char* argv[])
{
A::TA a("This is A");
B::TB b = a;
return 0;
}
1
Damenly0 2017-05-22 17:46:50 +08:00
using namespace std;
namespace B{ class TB; } namespace A { |
2
xss 2017-05-22 17:57:15 +08:00
用泛型不可以么,? 这样还可以解耦.....
``` template <class TA> class TB { TB(TA& that){ this.value = that.value; } } ``` |
3
sfqtsh 2017-05-22 17:58:14 +08:00
|
4
luoqeng 2017-05-22 18:07:45 +08:00
TB(const A::TA& ta) {
// this->m_pstr = ta.m_pstr; if (ta.m_pstr != NULL) { int len = strlen(ta.m_pstr); m_pstr = new (nothrow)char[len+1]; memcpy(m_pstr, ta.m_pstr, len); m_pstr[len] = '\0'; } } 深拷贝就行了啊 |
5
hackpro OP |
6
RitchieLee 2017-05-22 18:49:29 +08:00
@sfqtsh 亲测大佬的方法可解决楼主的问题
|
7
hackpro OP |
8
Damenly0 2017-05-22 19:37:53 +08:00
因为 B::TB::TB()已经涉及到具体 B 的实现,而非声明,考虑到 TB 又依赖于 TA 的实现。如#2 所说,可用 template 解耦
http://stackoverflow.com/questions/10546391/specify-a-class-member-function-as-a-friend-of-another-class |
9
wevsty 2017-05-22 20:25:43 +08:00
为什么不用继承?
|
10
xss 2017-05-23 09:51:39 +08:00
或许我写的 template 误导你了. 那个 class TA 实际上应该是 class T.
实际上按照你的需求, TB 是对 TA 是有一定要求的. 一般按照这个尿性发展下去, 你的 TB 一定会对 TA 的要求越来越多. 而一旦 TA 有什么风吹草动, 你就得改一大堆东西. 直接给例子吧: xss@xss [09:47:01] : ~/Code $ g++ -c test.cpp -o xxxeee xss@xss [09:47:09] : ~/Code $ cat test.cpp template <class T> class TB{ public: TB(T& that){ this.value = that.value; } friend void T::foo(void); private: int value; }; 我上面并没有生命一个 TA, 直接用 T 代替, 但是实际上也是可以编译通过的. 这样的话, 你至少不用考虑 TA 的问题, 因为 T 可以是任何东西..... |