小编nak*_*iya的帖子

如何以及为什么可以更改成员的访问级别?

昨天我结束了编码(有一些帮助)这样的事情:

#include <iostream>

using namespace std;

class A
{
    public:
        virtual void foo(){cout << "A::foo\n";}
};

class B : private A
{
    private:
        virtual void foo(){ cout << "B::foo\n";}
        void DoSomething(SomeOtherClass& o){o.DoSomething(*static_cast<A*>(this));}
};
Run Code Online (Sandbox Code Playgroud)

我尝试更改继承方法:

class B : public A
{
    private:
        virtual void foo(){ cout << "B::foo\n";}
};

int main()
{
    A* a = new B;
    a->foo();
}
Run Code Online (Sandbox Code Playgroud)

这仍然有效.我期望编译时错误.请告诉我为什么这是可能的以及可能的用途是什么?由于第一种情况,我知道一种用法 - 您可以为不同的类公开不同的接口.

编辑:

在第二种情况下,输出是B::foo.

c++ oop

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

std :: copy和std :: vector问题

我理解为什么这会导致段错误:

#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    int iArr[5] = {1, 2, 3, 4, 5};
    int *p = iArr;

    copy(p, p+5, v.begin());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但为什么这不会导致段错?

#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    int iArr[5] = {1, 2, 3, 4, 5};
    int *p = iArr;

    v.reserve(1);
    copy(p, p+5, v.begin());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ stl vector

6
推荐指数
2
解决办法
5126
查看次数

如何检查是否可以使用__PRETTY_FUNCTION__?

...../PluginLoader.h:34: multiple definition of 'Dummy_Func_For_Generating_FUNCTION_NAME_Macro()'

以下代码输出上述错误.我在我的档案中加入了警卫.其他一切都很好.

编辑:我想要实现的是检查是否__PRETTY_FUNCTION__已定义,如果是,请稍后在FUNCTION_NAME宏代码中使用它(用于记录目的).如果__PRETTY_FUNCTION__没有定义,请使用下一个最好的东西,依此类推.然而,我得到的回应让我意识到这是不可能的.那么,如果__PRETTY_FUNCTION__和所有这些不是宏,那么它们是什么?我如何检查某个实现是否有其中一个?

    void Dummy_Func_For_Generating_FUNCTION_NAME_Macro()
    {
#ifndef FUNCTION_NAME
    #ifdef __PRETTY_FUNCTION__
        #define FUNCTION_NAME __PRETTY_FUNCTION__
    #elif __FUNCTION__
        #define FUNCTION_NAME __FUNCTION__
    #elif __func__
        #define FUNCTION_NAME __func__
    #else
        #define FUNCTION_NAME ""
    #endif
#endif
    }
Run Code Online (Sandbox Code Playgroud)

c++ macros c-preprocessor

6
推荐指数
2
解决办法
9886
查看次数

这个函数定义如何工作?

gperf几天前我生成了一个哈希函数.我看到的hash功能对我来说是陌生的.它是这样的(我不记得确切的语法):

unsigned int
hash(str, size)
   register char* str;
   register unsigned int size;
{
   //Definition
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用C++编译器(g ++)进行编译时,由于没有strsize声明,它向我抛出了错误.但这是在C编译器(gcc)上编译的.所以,问题:

  1. 我认为C++是C的超集.如果是这样的话,这应该用C++编译器编译吧?
  2. C编译器如何理解定义?str并且size在他们第一次出现时是未申报的.
  3. 声明strsize函数签名之后但在函数体之前的目的是什么,而不是遵循在两个地方中的任何一个中执行它的正常方法?
  4. 如何在g ++上编译这个函数,以便在C++代码中使用它?或者我应该尝试从gperf生成C++代码?那可能吗?

c c++ compiler-construction syntax

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

我是唯一一个发现std :: move有点难以理解的人吗?

因此,我一直在阅读关于std::move,std::forwardrvalues,左值等广告在SO和其他地方.但我发现我无法掌握它.即使我有时会进行修复,但我认为我理解了关于指针,引用等的基本内容,这些都是在C++之前的所有内容.是我还是这些东西太重了?

c++ move-semantics c++11

5
推荐指数
2
解决办法
537
查看次数

完整哈希函数,用于一组没有更新的整数

在我工作的其中一个应用程序中,有必要使用这样的函数:

bool IsInList(int iTest)
{
   //Return if iTest appears in a set of numbers.
}
Run Code Online (Sandbox Code Playgroud)

数字列表在应用程序加载时已知(但在同一应用程序的两个实例之间并不总是相同),并且不会在整个程序中更改(或添加).整数本身可能很大并且范围很大因此没有效率vector<bool>.性能是一个问题,因为功能处于热点.我听说过Perfect hashing但是找不到任何好的建议.任何指针都会有所帮助.谢谢.

ps我理想情况下,如果解决方案不是第三方库,因为我不能在这里使用它们.如果可能的话,简单到足以理解和手动实现的东西将是很好的.

c++ hash performance

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

有没有办法替换库中的函数?

我使用的库为脚本语言定义了内部除法运算符。不幸的是,它不会对除数进行零检查。这会导致很多头痛。我知道接线员的签名。

double ScriptClass::Divide(double&, double&);

遗憾的是它甚至不是一个 C 函数。有什么方法可以让我的应用程序使用我自己的Divide函数而不是ScriptClass::Divide函数?

编辑:我知道dlopen(NULL,..)并用用户定义的函数替换“C”函数。可以对类成员函数执行此操作(而不诉诸使用损坏的名称)吗?

c++ linux g++

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

网格扩展器标头 - 无法正确排列

Expander为a定义了以下内容DataGrid.

<Expander IsExpanded="True" HorizontalAlignment="Stretch" Background="Blue">
    <Expander.Header>
            <Grid HorizontalAlignment="Stretch" Background="BurlyWood">
                      <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="3*" />
                        <ColumnDefinition Width="*" />
                      </Grid.ColumnDefinitions>

                      <TextBlock Text="{Binding Path=Name, StringFormat=\{0:D\}}" FontWeight="Bold" />
                      <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Column="1">
                        <TextBlock Text="Total : "/>
                        <TextBlock Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" FontWeight="Bold"/>
                      </StackPanel>
                </Grid>
        </Expander.Header>
        <ItemsPresenter />
</Expander>
Run Code Online (Sandbox Code Playgroud)

我需要在左侧显示项目名称,在组头标题的右端显示总和.但是我得到的是:

在此输入图像描述

如何将"总计"移动到标题的右端?

c# wpf

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

android usb UsbDeviceConnection.bulkTransfer 返回 -1

我正在尝试从我的 android 平板电脑向 POS 打印机发送命令。我已经能够使基本连接正常工作,但是现在当我尝试将数据发送到打印机时,bulkTransfer 返回 -1。请帮助我了解发生了什么。以下是从我进行所有数据传输的 android 站点中获取的修改后的广播接收器。

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if(device != null){
                      //call method to set up device communication

                        if(device.getVendorId() != 1659)
                            return;

                        UsbInterface intf = device.getInterface(0);
                        UsbEndpoint endpoint = intf.getEndpoint(0);
                        int direction = endpoint.getDirection();                            
                        UsbDeviceConnection connection = mUsbManager.openDevice(device);
                        connection.claimInterface(intf, forceClaim);

                        bytes = new byte[]{27, 64};

                        //**This …
Run Code Online (Sandbox Code Playgroud)

usb android

5
推荐指数
0
解决办法
2653
查看次数

如何将此代码转换为异步等待?

我有很多像这样的代码:

        var feed = new DataFeed(host, port);
        feed.OnConnected += (conn) =>
        {
            feed.BeginLogin(user, pass);
        };
        feed.OnReady += (f) =>
        {
             //Now I'm ready to do stuff.
        };

        feed.BeginConnect();
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用通常的异步操作方式.如何更改此代码才能使用async await?最好是这样的:

public async void InitConnection()
{
    await feed.BeginConnect();
    await feed.BeginLogin(user, pass);

    //Now I'm ready
}
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library async-await

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