
中午吃饭组里一个同事问的,折腾的一下午还是没搞定,牛皮吹大了,请教下大家如何解决,谢谢各位
基本需求是两个命名空间存在相同的一个类,TA/TB 以示区别
怎么将命令空间 A 中类 TA 的对象作为命名空间 B 中类 TB 构造函数的参数传入并访问其中的字段?
#include "stdafx.h" #include <iostream> using namespace std; class B::TB; namespace A { class TA { privat: 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 可以是任何东西..... |