我仍然是一名新手程序员,我知道过早的优化很糟糕,但我也知道复制大量的东西也很糟糕.
我已经阅读了复制省略和它的同义词,但维基百科上的例子让我觉得复制省略只有在要完全构建的同时返回要返回的对象时才会发生.
那些像矢量这样的对象呢?当用作返回值时,它通常只在填充某些东西时才有意义.毕竟,可以手动实例化空矢量.
那么,它是否也适用于这样的情况?
简洁的风格:
vector<foo> bar(string baz)
{
vector<foo> out;
for (each letter in baz)
out.push_back(someTable[letter]);
return out;
}
int main()
{
vector<foo> oof = bar("Hello World");
}
Run Code Online (Sandbox Code Playgroud)
我使用bar(矢量和输出,字符串文本)没有真正的麻烦,但上面的方式看起来更好,美观,并且意图.
对于模糊的问题标题感到抱歉,我只是想确定一些事情.
静态库不与其他静态库链接,对吧?
所以当我写一个slib:A,它使用另一个的功能:B,我必须提供的是B到A的标题,只有那些,即使A实际上使用B的功能?是?
只要exe:X,它使用A,将B.lib指定为链接器输入?
因此,在链接时,链接器接受A.lib,它基本上只知道B的一个函数在其代码中的某处被调用,并以某种方式填充来自B.lib的信息,使得A.lib'整体',在X得到之前与现在的工作部分联系起来了吗?
这些问题背后的动机是摆脱一些链接器警告4006并丢弃双重定义,我认为应该这样做,如果这实际上是一种有效的方法.
我正在使用QI和Phoenix,我想编写一个返回4个bool的小语法,它将用作语义动作中函数调用的参数.
我有几个需要这些东西的函数,到目前为止我已经使用过这种方法:
( qi::_bool >> qi::_bool >> qi::_bool >> qi::_bool)
[px::bind(&Bool4Function, spirit::_val, spirit::_1, spirit::_2, spirit::_3, spirit::_4)]
Run Code Online (Sandbox Code Playgroud)
虽然它可以自己使用它,但是在整个地方使用它只是简单的丑陋和混乱,即使使用'命名空间部分.
这就是为什么我想把这个表达式提取成一个独立的语法.
所以我尝试了这个(信用证转到ildjarn测试床):
///// grammar implementation /////
#include <boost/fusion/include/vector10.hpp>
#include <boost/spirit/include/qi_bool.hpp>
#include <boost/spirit/include/qi_char_.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi_operator.hpp>
#include <boost/spirit/include/qi_rule.hpp>
#include <boost/spirit/include/qi_string.hpp>
struct FourBools : boost::spirit::qi::grammar<
char const*,
boost::fusion::vector4<bool, bool, bool, bool>()
>
{
typedef boost::fusion::vector4<bool, bool, bool, bool> attribute_type;
FourBools() : base_type(start_)
{
using boost::spirit::bool_;
start_
= "4bools:"
>> bool_ >> ','
>> bool_ >> ','
>> bool_ >> ','
>> bool_ >> ';' …Run Code Online (Sandbox Code Playgroud) 假设有两个加载的缓冲区/文件,它们都通过分割窗口显示,行号已启用,因此已知.
有没有办法留在一个缓冲区中,指定另一个缓冲区的一行并将其拉出以便将其放入活动缓冲区?
随着时间的推移,我开始欣赏许多小功能的心态,而且我真的非常喜欢它,但是我很难将自己的羞怯用于课堂上,特别是那些拥有超过一小部分非公共成员的课程.变量.
每个额外的辅助函数都会混淆接口,因为代码通常是特定于类的,我不能只使用一些通用代码.(据我所知,无论如何,还是初学者,不知道那里的每个图书馆等等)
所以在极端情况下,我通常会创建一个帮助类,它成为需要操作的类的朋友,因此它可以访问所有非公共内容.
另一种选择是需要参数的自由函数,但即使过早的优化是邪恶的,我实际上并没有对它进行分析或反汇编......我仍然只想到传递我需要的所有东西,有时甚至只是作为参考,即使每个参数应该是一个简单的地址.
这一切都是偏好的问题,还是有一种广泛使用的处理这种东西的方式?
我知道尝试强制进入模式是一种反模式,但我担心代码共享和标准,我想让其他人阅读的内容至少相当不痛苦.
那么,你们如何应对呢?
编辑:一些例子促使我提出这个问题:
关于自由函数:DeadMG对使自由函数工作感到困惑......没有参数.
我对这些函数的问题是,与成员函数不同,自由函数只知道数据,如果你给它们,除非使用全局变量等.
然而,有时候,我有一个庞大而复杂的过程,我想为了可读性和理解而分解,但是有很多不同的变量可以在所有地方使用,将所有数据传递给自由函数,这些函数对每个函数都是不可知的.一点成员数据,看起来简直是噩梦. 单击以查看示例
这是一个函数片段,它将数据转换为我的网格类接受的格式.例如,它将所有这些参数重构为"finalizeMesh"函数.在这一点上,它是一个巨大的计算机网格数据功能的一部分,并且在整个地方使用了一些维度信息,大小和缩放信息,交织在一起.
这就是我的意思,"自由功能有时需要太多参数".
我认为它显示出糟糕的风格,并不一定是本身不合理的症状,我希望:P.
如果有必要的话,我会尽力清理更多的事情.
假设我有这样一个类:
class A
{
public:
A(){}
~A(){}
};
Run Code Online (Sandbox Code Playgroud)
并通过Luabind将它暴露给Lua,如下所示:
module(luaState)
[
class_<A>("Foo")
.def(constructor<>())
];
Run Code Online (Sandbox Code Playgroud)
最后在这样的脚本中实例化它:
A = Foo();
Run Code Online (Sandbox Code Playgroud)
那时A的实际"存在状态"是什么?
它是在堆中的某个地方,并且lua在某处保留了对它的引用?(或luabind ::对象?)
我觉得它只能是一个指针,如新的或同等的.
但是,我可以将函数绑定到接受引用的lua,例如lua_doSomething(A & a),最终会有一个实际的引用.诚然,我知道这很可能只是路过被luabind a的*a,但我不知道如果这是怎么回事了.
我问这个的原因是为了更好地理解和预测在脚本中实例化的对象的生命周期.
那个,我不确定所有权或生命周期是否会改变,如果不是像上面那样将类暴露给lua,我这样做:
A * lua_CreateA()
{
return new A();
}
module(luaState)
[
class_<A>("Foo")
];
module(luaState)
[
def("createA",&lua_CreateA)
];
Run Code Online (Sandbox Code Playgroud)
并使用它像
A = createA();
Run Code Online (Sandbox Code Playgroud)
根据我到目前为止所理解的逻辑,这个案例需要我进行清理,因为我是分配一个新对象的人,除非为luabind这样的赋值与使用绑定构造函数这样做.
简而言之,我真的很困惑对象的生命周期和这里的东西...我搜索与此相关的关键字,但我只是得到像http://www.gamedev.net/topic/525692-luabind这样的东西 -ownership和-破坏/
这不是我想知道的.我想了解在幕后处理有关分配,实例化,生命周期和所有这些事情的具体方法.
而不是整个窗口完成关闭,最大和最小化按钮,以及边框?
我正在尝试保存客户区的屏幕截图... maximizedBounds崩溃应用程序...
这可能是一个非常简单的问题,特别是因为我已经成功地使用QI解析了一段时间的简单结构,并且可能应该已经知道了答案,但是无论如何我都逃避了......
假设我们有一个容器,如:
struct GenderTally
{
std::vector<std::string> males;
std::vector<std::string> females;
};
Run Code Online (Sandbox Code Playgroud)
和输入文件一样
m:Steve;
f:Dora;
f:Martha;
m:Joe;
...
Run Code Online (Sandbox Code Playgroud)
对于特定类别的对象以任何顺序出现而不是所有对象都可能出现.
我将在这里跳过Fusion改编,但它将是两个字符串向量.
我的问题是,构建一个填充这样的条件容器的语法.到目前为止,我通过多次解析输入来解决这个问题,每次都使用专门的语法.在这个例子中,这将是男性和女性.
在QI mini-XML教程中,我得到的印象是自动规则会消除语义操作,但不可否认,我是一个新手,并且仍然受到像QI使用的硬核(模板)魔术API的威胁.所以,即使我知道这是糟糕的,糟糕的形式......我会非常感激在这里得到一个真实的例子,因为我在头灯堵塞时遇到了一些主要的鹿.编辑:不一定要完全适用于这个结构,只是...一个使用自动规则的语法的实际例子,并将事物放入适当的存储桶中.
void
foo()
{
}
Run Code Online (Sandbox Code Playgroud)
这就是我得到的.
我最近才冒险进入GNU等水域,所以也许我只是缺乏经验,但......
我以前从未见过这个惯例.这有什么用处?它是否提供一些编辑相关的好处?还是人类的好处?就像知道每个函数名称从第1列开始一样?
编辑:我确实找到一个网站提到这样做是"好的",但似乎这不是经常使用的惯例.
猜猜作者喜欢这种风格,让我意识到为什么这个问题可能在一开始就被低估了.
考虑到以下指南 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
为什么这不匹配以 foo 或 foobar 结尾的单词?
/[0-9a-zA-Z]+foo(?:bar)*\b/i
Run Code Online (Sandbox Code Playgroud)
它应该是 4chan.orgs 技术板的 wordfilter 的一部分,由一个名为 4chanX 的插件应用。我几乎逐字粘贴了代码以过滤包含单词的注释。
我是Haskell noob,目前只使用它来配置xmonad.
我想将我的配置放入一个git仓库,因为我不想硬编码我的家庭目录来抓住我的图标.
我查看了 http://www.haskell.org/haskellwiki/How_to_get_rid_of_IO, 但我太无知了解它.
hd h = h =<< getHomeDirectory
getIcon::String -> String
getIcon out = ( "^i("++hd++".xmonad/dzen2/"++out )
Run Code Online (Sandbox Code Playgroud)
这有可能吗?如果是这样,怎么样?我不想在目录上操作,我只想要路径,作为一个字符串,它杀了我.
错误是:
Run Code Online (Sandbox Code Playgroud)Couldn't match expected type `[Char]' with actual type `(FilePath -> IO b0) -> IO b0' In the first argument of `(++)', namely `hd' In the second argument of `(++)', namely `hd ++ ".xmonad/dzen2/" ++ out' In the expression: ("^i(" ++ hd ++ ".xmonad/dzen2/" ++ out)
在我看来,IO monad根本没有删除.
更新:好的.我将学习如何适应IO规则,在此之前我将保持硬编码并使用将替换相应位的脚本克隆配置文件.
对于模糊的问题标题感到抱歉,但我在这里有这些typedef:
typedef std::list<AnimationKeyframe> Timeline;
typedef Timeline::iterator Keyframe;
Run Code Online (Sandbox Code Playgroud)
让我们说一个这样的课:
class foo
{
Timeline timeline;
Keyframe left,right;
};
Run Code Online (Sandbox Code Playgroud)
我也有一个复制/赋值构造函数,因为我存储迭代器(看起来很糟糕),麻烦就在那里.
Keyframe myTemp, hisTemp;
this->left = this->timeline.begin(); // assigns
myTemp = this->timeline.begin(); // assigns
hisTemp = that.timeline.begin() // does not assign
Run Code Online (Sandbox Code Playgroud)
一旦我试图用一个'那个'(另一个foo)分配一个Keyframe,我就会得到看起来像模糊问题的错误.
binary'=':找不到哪个运算符采用'std :: _ List_const_iterator <_Mylist>'类型的右手操作数(或者没有可接受的转换)
附加信息:
with
[
_Mylist=std::_List_val<AnimationKeyframe,std::allocator<AnimationKeyframe>>
]
could be 'std::_List_iterator<_Mylist> &std::_List_iterator<_Mylist>::operator =(const std::_List_iterator<_Mylist> &)'
with
[
_Mylist=std::_List_val<AnimationKeyframe,std::allocator<AnimationKeyframe>>
]
while trying to match the argument list '(Keyframe, std::_List_const_iterator<_Mylist>)'
with
[
_Mylist=std::_List_val<AnimationKeyframe,std::allocator<AnimationKeyframe>>
]
Run Code Online (Sandbox Code Playgroud)
是什么导致这种奇怪的行为 我怀疑使用迭代器作为状态的糟糕风格......但我不知道除了保持指针之外我还能做些什么.
好吧,到目前为止,我认为头文件中定义的函数被视为内联函数,就像模板的东西一样,定义一次,等等。
我也使用包含防护,但我仍然遇到多个已定义对象的链接器错误,我知道这是因为所有这些不同的单元都复制了链接器试图挑选出哪个项目是正确的内容。
我还知道内联只是一个建议,甚至可能不会被编译器使用等。
然而,我必须在我编写的只有标头的小工具集中显式定义所有这些小函数。
即使函数很大,我也必须将它们声明为内联,并且编译器仍然可能忽略该提示。
但无论如何我必须这样定义它们。
例子:
#ifndef texture_math_h__
#define texture_math_h__
float TexcoordToPixel(float coord, float dimension)
{
return coord * dimension;
}
float PixelToTexcoord(float pixel, float dimension)
{
return pixel / dimension;
}
float RecalcTexcoord(float coord,float oldDimension, float newDimension)
{
return PixelToTexcoord(TexcoordToPixel(coord,oldDimension),newDimension);
}
#endif // texture_math_h__
Run Code Online (Sandbox Code Playgroud)
对于包含该文件的每个单元,错误是 blabla 已在 xxx.obj 中定义
当我声明所有这些内联时,它链接正确。
这是什么原因呢?这不是一个大问题,而且,优化也可能在 cpp 中找到,对吗?
我只是好奇为什么会出现在这里,希望它不会太多重复,谢谢您的宝贵时间。
c++ ×9
coding-style ×2
vim ×2
allocation ×1
ambiguity ×1
boost ×1
boost-fusion ×1
c ×1
class-design ×1
copy-elision ×1
dependencies ×1
dimensions ×1
haskell ×1
inline ×1
iterator ×1
java ×1
linker ×1
lua ×1
luabind ×1
regex ×1
stl ×1
swing ×1
xmonad ×1