在我的类设计中,我广泛使用抽象类和虚函数.我感觉虚拟功能会影响性能.这是真的?但我认为这种性能差异并不明显,看起来我正在做过早的优化.对?
我在我的一个类中的方法中使用了枚举的完全限定名.但我收到编译器警告,上面写着"警告C4482:使用非标准扩展名:enum'Foo'用于限定名称".在C++中,我们是否需要使用没有限定名称的枚举?但IMO,看起来很难看.
有什么想法吗?
C#将不允许编写非成员函数,并且每个方法都应该是类的一部分.我认为这是所有CLI语言的限制.但我错了,我发现C++/CLI支持非成员函数.编译时,编译器会将该方法作为某个未命名类的成员.
这是C++/CLI标准所说的,
[注意:CLI将非成员函数视为某些未命名类的成员; 但是,在C++/CLI源代码中,此类函数无法使用该类名显式限定.结束说明]
未指定元数据中非成员函数的编码.[注意:这不会导致互操作问题,因为此类功能无法获得公共可见性.结束说明]
所以我的问题是为什么C#不实现这样的东西?或者你认为不应该有非成员函数,每个方法应该属于某个类?
我的意见是拥有非成员函数支持,它有助于避免污染类的接口.
有什么想法吗..?
我有一个有很多小功能的课.通过小函数,我的意思是不执行任何处理但仅返回文字值的函数.就像是:
string Foo::method() const{
return "A";
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个头文件"Foo.h"和源文件"Foo.cpp".但由于函数非常小,我正在考虑将它放在头文件中.我有以下问题:
我试图在最近两个小时内构建Boost C++库并且没有任何结果就停止了.由于我是C++的新手,我无法正确构建.如何使用Visual Studio 2008正确构建它?
我需要使用BCP工具来提取库的子集.所以我需要先建立BCP,对吧?这该怎么做?当我尝试构建它时,我收到以下错误
致命错误LNK1104:无法打开文件'libboost_filesystem-vc90-mt-gd-1_37.lib'.
我在哪里可以获得上面给出的库文件?
我正在尝试使用C++,发现下面的代码非常奇怪.
class Foo{
public:
virtual void say_virtual_hi(){
std::cout << "Virtual Hi";
}
void say_hi()
{
std::cout << "Hi";
}
};
int main(int argc, char** argv)
{
Foo* foo = 0;
foo->say_hi(); // works well
foo->say_virtual_hi(); // will crash the app
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道虚方法调用崩溃,因为它需要vtable查找,并且只能使用有效对象.
我有以下问题
say_hiNULL指针?foo分配?有什么想法吗?
我知道以下是在C#中使用unicode的方法
string unicodeString = "\u0D15";
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我不会在编译时获得字符代码(0D15).我在运行时从XML文件中获取此信息.我想知道如何将此代码转换为unicode字符串?我尝试了以下内容
// will not compile as unrecognized escape sequence
string unicodeString = "\u" + codeFromXML;
// will compile, but just concatenates u with the string got from XML file.
string unicodeString = "\\u" + codeFromXML;
Run Code Online (Sandbox Code Playgroud)
我该如何处理这种情况?
任何帮助都会很棒!
我在这里看到很多关于套接字的资源.我相信他们都没有涵盖我想知道的细节.在我的应用程序中,服务器执行所有处理并向客户端发送定期更新.
本文的目的是涵盖开发套接字应用程序和讨论最佳实践时所需的所有基本思想.以下是几乎所有基于套接字的应用程序都会看到的基本内容.
1 - 绑定和侦听套接字
我使用以下代码.它在我的机器上运行良好.在真实服务器上部署时,是否需要注意其他事项?
IPHostEntry localHost = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(localHost.AddressList[0], 4444);
serverSocket = new Socket(endPoint.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
serverSocket.Bind(endPoint);
serverSocket.Listen(10);
Run Code Online (Sandbox Code Playgroud)
2 - 接收数据
我使用了255个大小的字节数组.因此,当我收到超过255个字节的数据时,我需要调用receive方法,直到获得完整数据,对吧?获得完整数据后,我需要追加到目前为止收到的所有字节以获取完整的消息.那是对的吗?还是有更好的方法?
3 - 发送数据并指定数据长度
由于TCP无法找到要接收的消息长度,因此我计划在消息中添加长度.这将是数据包的第一个字节.因此客户端系统知道有多少数据可供读取.
还有其他更好的方法?
4 - 关闭客户端
当客户端关闭时,它将向服务器发送一条消息,指示关闭.服务器将从其客户端列表中删除客户端详细信息.以下是客户端用于断开套接字的代码(消息传递部分未显示).
client.Shutdown(SocketShutdown.Both);
client.Close();
Run Code Online (Sandbox Code Playgroud)
有什么建议或问题吗?
5 - 关闭服务器
服务器向所有客户端发送消息,指示关闭.每个客户端在收到此消息时将断开套接字.客户端将关闭消息发送到服务器并关闭.一旦服务器收到来自所有客户端的关闭消息,它将断开套接字并停止监听.在每个客户端套接字上调用Dispose以释放资源.这是正确的方法吗?
6 - 未知客户端断开连接
有时,客户端可能会断开连接而不通知服务器.我的处理方法是:当服务器向所有客户端发送消息时,检查套接字状态.如果未连接,请从客户端列表中删除该客户端并关闭该客户端的套接字.
任何帮助都会很棒!
我知道find方法在std :: map中找到提供的键,并将迭代器返回给元素.反正有没有找到值并获得元素的迭代器?我需要做的是检查std :: map中是否存在指定的值.我通过循环地图中的所有项目并进行比较来完成此操作.但我想知道有没有更好的办法.
这是我写的
bool ContainsValue(Type_ value)
{
bool found = false;
Map_::iterator it = internalMap.begin(); // internalMap is std::map
while(it != internalMap.end())
{
found = (it->second == value);
if(found)
break;
++it;
}
return found;
}
Run Code Online (Sandbox Code Playgroud)
编辑
如何在内部使用另一个存储值,键组合的地图.所以我可以打电话找到它吗?std :: map中的find()是否进行顺序搜索?
谢谢