我必须使用智能指针,我发现来自boost的"shared_ptr"看起来不错.我下载了boost库,我可以看到很多文件和库.有没有办法只使用shared_ptr?
我正在用C++开始一个开源的跨平台项目.我的开发环境是Linux.可能还有其他开发人员也从不同的平台开发.因此,我需要一些帮助来开始配置和开发环境设置,以便来自多个平台的所有开发人员都可以轻松开发.
以下是我的问题
有什么想法吗?
编辑
谢谢你的回答.还有一个问题.
你手工创建makefile吗?或者有没有可以生成它的工具?
我正在学习makefile,我知道如何创建一个简单的makefile.我正在转向嵌套的makefile.这是我的目录结构
/src
...makefile
...main.cpp
...foo
......makefile
......foo.cpp
......foo.h
Run Code Online (Sandbox Code Playgroud)
当调用root makefile时,它会调用目录foo中的makefile .这是我的问题
任何帮助都会很棒!
我打算在我的C++程序中使用库.开发正在Linux上进行,但应用程序旨在在Linux和Windows上进行编译.据我所知,Windows中共享库(.so)的直接等价物是DLL,对吧?
在使用g ++的Linux中,我可以使用-fPIC和-shared标志创建共享库.AFAIK,共享库不需要进行其他代码更改.但是Windows DLL中的情况有所不同.在那里我应该指定必须使用dllexport导出的函数,对吧?
我的问题是如何处理这种情况?我的意思是dllexport在Linux中无效,编译器会出错.但它在Windows中是必需的.那么如何编写一个可以在两个平台上编译而无需更改代码的函数呢?
使用的编译器
任何帮助都会很棒!
假设我有一个叫做的课程Customer.现在我需要在视图上呈现客户.所以我创建CustomerViewModel了用于绑定.我正在寻找创建CustomerViewModel课程的最佳方法.以下是我创建它的想法.
1 - 在视图模型上再次创建客户中的所有属性.将客户实例注入视图模型,每个属性将从该客户对象返回值.这种方法的优点是我可以为所有视图模型创建一个公共基类,并在那里转储常用功能.缺点是在视图模型上再次创建所有属性并进行维护所需的时间.
2 - 从客户处获取视图模型.所以我在视图模型中拥有所有客户的特性.但这不允许我使用公共基类并将常见的视图模型逻辑放在那里.
所以我想知道创建视图模型的最佳方法是什么?有没有比我想象的更好的替代方法?
我有一个具有以下目录结构的项目.
root
--include
----module1
----module2
--src
----module1
----module2
Run Code Online (Sandbox Code Playgroud)
因此,一个文件说,foo.cpp在src/module1有包括像,
#include "../../include/module1/foo.hpp"
Run Code Online (Sandbox Code Playgroud)
这看起来很混乱,很难写.我发现写作包括喜欢
#include <module1/foo.h>
Run Code Online (Sandbox Code Playgroud)
并提供包含文件搜索路径,以便root/include在编译时整洁.但是,我不确定这种风格有任何缺点.
您更喜欢哪一个?为什么?你也看到以上述方式组织文件有什么问题吗?
请考虑以下代码,
struct foo
{
foo()
{
std::cout << "Constructing!" << std::endl;
}
foo(const foo& f)
{
std::cout << "Copy constructing!" << std::endl;
}
~foo()
{
std::cout << "Destructing.." << std::endl;
}
};
foo get()
{
foo f;
return f;
}
int main()
{
const foo& f = get();
std::cout << "before return" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
MSVC上的输出
Constructing!
Copy constructing!
Destructing..
before return
Destructing..
Run Code Online (Sandbox Code Playgroud)
GCC的产出
Constructing!
before return
Destructing..
Run Code Online (Sandbox Code Playgroud)
MSVC上的结果看起来不正确.
问题
const foo& f = get()并且const …我有一个trie我用来做一些字符串处理.我有一个简单的编译器,它trie从一些数据生成.生成后,我trie不会在运行时更改.
我正在寻找一种方法,我可以将trie保存在文件中并有效地加载它.我已经看过sqllite了解它们是如何持久的,b-tree但它们的文件格式看起来有点先进,我可能不需要所有这些.
如果有人可以提供一些想法来坚持和阅读,那将会很有帮助trie.我用C编程
作为学习C的一部分,我编写了以下代码来将目录名与文件名组合在一起.例如:combine("/home/user", "filename") 将导致/home/user/filename.这个功能可以跨平台工作(至少在所有流行的Linux发行版和Windows 32和64位上).
这是代码.
const char* combine(const char* path1, const char* path2)
{
if(path1 == NULL && path2 == NULL) {
return NULL;
}
if(path2 == NULL || strlen(path2) == 0) return path1;
if(path1 == NULL || strlen(path1) == 0) return path2;
char* directory_separator = "";
#ifdef WIN32
directory_separator = "\\";
#else
directory_separator = "/";
#endif
char p1[strlen(path1)]; // (1)
strcpy(p1, path1); // (2)
char *last_char = &p1[strlen(path1) - 1]; // (3)
char *combined = malloc(strlen(path1) …Run Code Online (Sandbox Code Playgroud) 我正在学习C.我有一个方法,需要3个字符串并将它们组合起来做一些操作.以下是我使用GCC编译器的第一个实现.
void foo(const char *p1, const char *p2, const char *p3)
{
size_t length = strlen(p1) + strlen(p2) + strlen(p3);
char combined[length + 1];
memset(combined, 0, length + 1);
strcat(combined, p1);
strcat(combined, p2);
strcat(combined, p3);
printf("Result : %s", combined);
}
int main()
{
foo("hello ", "world ", "how");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是当我使用编译时cc -Wall -pedantic -g foo.c -o foo,我开始收到类似的警告ISO C90 forbids variable length array ‘combined’.MSVC没有编译此代码.更改了代码
void foo(const char *p1, const char *p2, const char *p3)
{
size_t …Run Code Online (Sandbox Code Playgroud) c++ ×5
c ×3
makefile ×2
string ×2
.net ×1
boost ×1
header-files ×1
linux ×1
mvvm ×1
nested ×1
open-source ×1
persistence ×1
portability ×1
refactoring ×1
trie ×1
windows ×1