小编Wra*_*ath的帖子

非成员非朋友功能真的会增加封装吗?

我目前正在阅读Scott Meyers的Effective C++书籍,但我无法理解第23项.他说:

首选非成员非友元函数到成员函数.这样做可以提高封装,封装灵活性和功能扩展性.

虽然我可以看到在课外添加外部函数的意义,但我没有看到它的优点.他谈到这些因为他们正在增加封装.嗯,是的,这是正确的,因为非成员非朋友函数将无法访问在类中声明为私有的任何成员变量.但是,这就是我无法解决的问题.拥有允许对象控制的成员函数在某种程度上是必不可少的 - 对于所有数据成员都是公共的POD可以做些什么?老实说,我看不到任何实际用法.Havining说,即使我们有非会员非朋友功能,封装也不会因为我们仍然需要而改变!!公众!! MEMBER函数与我们的对象进行交互.

那么为什么我 - 或者其他任何人 - 更喜欢非会员非朋友功能而不是会员功能呢?当然,我们可以在现有的成员函数上编写包装器,这些函数可能按逻辑顺序对它们进行分组,但这就是全部.我在这里看不到任何重新封装的封装.

c++

9
推荐指数
2
解决办法
778
查看次数

std :: vector作为模板参数...所有的地狱打破了

我很快就会爆炸......有人请指出目前在这里出了什么问题:

template <typename TType, template <typename ...> class Container, class Comparer>
Container<TType>* sort(const Container<TType>& container) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用std :: vector作为其Container参数调用此函数时,问题就出现了.我收到以下错误:

main.cpp:24:34: error: no matching function for call to 'func()'
main.cpp:24:34: note: candidate is:
main.cpp:14:6: note: template<class T, template<class ...> class Container> void func()
main.cpp:14:6: note:   template argument deduction/substitution failed:
Run Code Online (Sandbox Code Playgroud)

以下是我试图称之为:

std::vector<int>* m(sort<int, std::vector<int>, Comparer>(m));
Run Code Online (Sandbox Code Playgroud)

当我从它运行的函数中删除模板模板参数时,但没有它...我正在使用MinGW附带的最新g ++编译器.IDE是NetBeans 7.3,不应该影响太多.编译器参数是:

-std=c++11 -Wall -pedantic
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助, - 乔伊

c++

3
推荐指数
1
解决办法
1162
查看次数

XPath选择存在具有给定属性值的子节点的节点

我正在尝试创建az xpath,我想要获得一个节点,其中存在一个具有属性的子节点.我的问题是这个结构的唯一区别是子属性.这是一个向您展示我的意思的例子:

<Values>
    <record name="svc_sig">
        <record name="sig_in">
            <array name="rec_fields">
                <record>
                    <value name=field_name">UniqueName1</value>
                </record>
                <record>
                    <value name=field_name">UniqueName2</value>
                </record>
                <record>
                    <value name=field_name">UniqueName3</value>
                </record>
                <record>
                    <value name=field_name">UniqueName4</value>
                </record>
            </array>
        </record>
    </record>
<Values>
Run Code Online (Sandbox Code Playgroud)

例如,给定UniqueName3我想获取包含它的记录.到目前为止我尝试了以下内容:

/Values/record[@name='svc_sig']/record[@name='sig_in']/array[@name]/record/value[@name='field_name']
Run Code Online (Sandbox Code Playgroud)

但是,我得到了具有属性field_name的所有值节点.

xml xpath

2
推荐指数
1
解决办法
3451
查看次数

从String中删除字符直到它变空

我无法理解这一点.我试图删除字符串中所有出现的某个字符,直到字符串变空.我知道我们可以通过使用string :: erase和std :: remove的组合从std :: string中删除所有字符出现,如下所示:

s.erase(remove(s.begin(), s.end(), '.'), s.end());
Run Code Online (Sandbox Code Playgroud)

在哪里'.' 是要删除的实际字符.如果我尝试删除某些字符,它甚至可以工作.现在让我们考虑以下字符串:'abababababababa'.我想要实现的是将这个字符串减少为灰烬,删除所有'a'用于startes,这将留下几个'b'.然后删除所有那些会留下空字符串的'b'.当然这只是我的任务的一部分,但我可以缩小它的问题.这是我基于上层功能组合的天真方法:

string s = "abababababababa";
while (!s.empty()) {
    ...
    s.erase(remove(s.begin(), s.end(), s[0]), s.end());
    ...
}
Run Code Online (Sandbox Code Playgroud)

当然它不起作用,我似乎无法找出原因.通过调试应用程序,我可以看到如何修改"s"字符串.虽然如果我为remove的第三个参数设置了一个字符常量,但是s.erase ...工作正常,如果我尝试使用char变量则会失败.以下是每次迭代后s字符串的样子:

Removing[a] from [abababababababa] Result: baaaaaaa
Removing[b] from [baaaaaaa] Result: a
Removing[a] from [a] Result: -
Run Code Online (Sandbox Code Playgroud)

虽然我期望2个操作,直到一个字符串变为空 - 这是有效的,如果我手工硬编码字母并使用s.erase两次 - 它实际上需要3次迭代.然而,最令人沮丧的是,当我在第一次迭代中删除'a'时,只删除第一个'a'而删除所有其他'b'.为什么会这样?是否内部擦除/删除的原因是什么?

c++

1
推荐指数
1
解决办法
109
查看次数

标签 统计

c++ ×3

xml ×1

xpath ×1