昨天我结束了编码(有一些帮助)这样的事情:
#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.
我理解为什么这会导致段错误:
#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) ...../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) gperf几天前我生成了一个哈希函数.我看到的hash功能对我来说是陌生的.它是这样的(我不记得确切的语法):
unsigned int
hash(str, size)
register char* str;
register unsigned int size;
{
//Definition
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试使用C++编译器(g ++)进行编译时,由于没有str并size声明,它向我抛出了错误.但这是在C编译器(gcc)上编译的.所以,问题:
str并且size在他们第一次出现时是未申报的.str和size函数签名之后但在函数体之前的目的是什么,而不是遵循在两个地方中的任何一个中执行它的正常方法?因此,我一直在阅读关于std::move,std::forwardrvalues,左值等广告在SO和其他地方.但我发现我无法掌握它.即使我有时会进行修复,但我认为我理解了关于指针,引用等的基本内容,这些都是在C++之前的所有内容.是我还是这些东西太重了?
在我工作的其中一个应用程序中,有必要使用这样的函数:
bool IsInList(int iTest)
{
//Return if iTest appears in a set of numbers.
}
Run Code Online (Sandbox Code Playgroud)
数字列表在应用程序加载时已知(但在同一应用程序的两个实例之间并不总是相同),并且不会在整个程序中更改(或添加).整数本身可能很大并且范围很大因此没有效率vector<bool>.性能是一个问题,因为功能处于热点.我听说过Perfect hashing但是找不到任何好的建议.任何指针都会有所帮助.谢谢.
ps我理想情况下,如果解决方案不是第三方库,因为我不能在这里使用它们.如果可能的话,简单到足以理解和手动实现的东西将是很好的.
我使用的库为脚本语言定义了内部除法运算符。不幸的是,它不会对除数进行零检查。这会导致很多头痛。我知道接线员的签名。
double ScriptClass::Divide(double&, double&);
遗憾的是它甚至不是一个 C 函数。有什么方法可以让我的应用程序使用我自己的Divide函数而不是ScriptClass::Divide函数?
编辑:我知道dlopen(NULL,..)并用用户定义的函数替换“C”函数。可以对类成员函数执行此操作(而不诉诸使用损坏的名称)吗?
我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)
我需要在左侧显示项目名称,在组头标题的右端显示总和.但是我得到的是:

如何将"总计"移动到标题的右端?
我正在尝试从我的 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) 我有很多像这样的代码:
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)