标签: overloading

Delphi/pascal:使用不同的原型重载构造函数

我正在尝试创建一个子类的TForm

  1. 某些案例的特殊构造函数,以及
  2. 一个默认构造函数,它将保持与当前代码的兼容性.

这是我现在的代码:

interface
  TfrmEndoscopistSearch = class(TForm)
  public
    /// original constructor kept for compatibility
    constructor Create(AOwner : TComponent); overload; override;
    /// additional constructor allows for a caller-defined base data set
    constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); overload;
  end;
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但我总是得到编译器警告:

[Warning] test.pas(44): Method 'Create' hides virtual method of base type 'TCustomForm'
  • 添加"过载"; 在第二个构造函数之后将无法编译."[错误] test.pas(44):"创建"声明与之前的声明不同".
  • 使第二个构造函数的一个类函数编译时没有任何错误或警告,但在运行时死于访问冲突(所有成员变量都是零).

delphi constructor overloading

20
推荐指数
3
解决办法
3万
查看次数

C++:构造函数只接受字符串文字

是否有可能创建一个接受字符串文字的构造函数(或函数签名),而不是例如char const *

是否有可能有两个可以区分字符串文字的重载char const *

C++ 0x会允许使用自定义后缀 - 但我正在寻找"早期"解决方案.

基本原理:避免在作为字符串文字给出时不会被修改的字符串的堆副本.

这些字符串直接转到API,期望const char *没有任何处理.大多数调用确实使用不需要额外处理的文字,只在少数情况下构建它们.我正在寻找保留原生呼叫行为的可能性.

注意: - 因为它出现在答案中:有问题的代码根本不使用std::string,但一个很好的例子是:

class foo
{
   std::string m_str;
   char const * m_cstr;      
 public:
   foo(<string literal> s) : m_cstr(p) {}
   foo(char const * s) : m_str(s) { m_cstr = s.c_str(); }
   foo(std::string const & s) : m_str(s) { m_cstr = s.c_str(); }

   operator char const *() const { return m_cstr; }
}
Run Code Online (Sandbox Code Playgroud)

结果:

(1)不能做到.
(2)我意识到我甚至不是在寻找一个文字,而是一个编译时常量(即"任何不需要复制的东西").

我可能会使用以下模式: …

c++ constructor overloading string-literals

20
推荐指数
4
解决办法
5091
查看次数

为什么有人想要重载&(地址)运算符?

可能重复:有
什么合理的理由使一元运算符超载?

我刚看了这个问题,我不禁想知道:

为什么有人可能想要重载&("address-of")运算符?

   some_class* operator&() const { return address_of_object; }

有没有合法的用例?

c++ overloading operator-overloading address-operator

20
推荐指数
3
解决办法
7860
查看次数

Delphi:方法'Create'隐藏了基础的虚拟方法 - 但它就在那里

考虑假设的对象层次结构,从以下开始:

TFruit = class(TObject)
public
    constructor Create(Color: TColor); virtual;
end;
Run Code Online (Sandbox Code Playgroud)

及其后代:

TApple = class(TFruit)
public
    constructor Create(); overload; virtual;
    constructor Create(Color: TColor); overload; override; //deprecated. Calls other constructor - maintaining the virtual constructor chain
end;
Run Code Online (Sandbox Code Playgroud)

这里的想法是我已经覆盖了基类的构造函数,其重载也恰好是虚拟的.

德尔福抱怨:

方法'Create'隐藏基类型'TFruit'的虚方法

除了它不隐藏它 - 它就在那里!

  • 覆盖了祖先中的虚拟方法,并且
  • 我用另一个版本重载了

这是怎么回事?

delphi overloading

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

将数组传递给params object []或IEnumerable <T>的函数

我想将一个自定义对象数组传递给一个String.Join具有以下签名的函数:

  • public static string Join(string separator, params Object[] values)
  • public static string Join(string separator, IEnumerable<T> values)

如果我这样调用函数:

var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join("\n", arr);
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误:

以下方法或属性之间的调用不明确:'string.Join(string,params object [])'和'string.Join(string,System.Collections.Generic.IEnumerable)'

我可以通过使用IEnumerable<T>函数来解决歧义:

var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join<MyClass>("\n", arr);
Run Code Online (Sandbox Code Playgroud)

但是我可以调用该params object[]函数吗?在性能关键的情况下,最好是直接访问数组而不是通过枚举器.

我正在使用C#4.0,如果这有任何区别.

c# arrays string overloading enumerable

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

SFINAE在类型和非类型模板参数的情况下工作方式不同

为什么这段代码有效:

template<
    typename T, 
    std::enable_if_t<std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}

template<
    typename T, 
    std::enable_if_t<!std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}
Run Code Online (Sandbox Code Playgroud)

并且可以正确区分这两个调用:

Add(1);
Add(1.0);
Run Code Online (Sandbox Code Playgroud)

而以下代码如果编译导致重新定义Add()错误?

template<
    typename T, 
    typename = typename std::enable_if<std::is_same<T, int>::value, T>::type>
void Add(T) {}

template<
    typename T, 
    typename = typename std::enable_if<!std::is_same<T, int>::value, T>::type>
void Add(T) {}
Run Code Online (Sandbox Code Playgroud)

所以如果模板参数是类型,那么我们就重新定义了函数,如果它是非类型的,那么一切都好.

c++ templates overloading sfinae c++11

20
推荐指数
2
解决办法
1194
查看次数

Ruby中具有相同名称和不同参数的方法

我有这个代码:

def setVelocity (x, y, yaw)
  setVelocity (Command2d.new(x,y,yaw))
end
def setVelocity (vel)
......
end 
Run Code Online (Sandbox Code Playgroud)

vel是一个Command2D类,有3个属性,可比较和定义+,基本上是一个方便的类来管理这3个属性,所以我想在我的库内部使用它(不想让它们变成私有的,要么给它们奇怪的名字).但是,即使参数数量不同,Ruby似乎也只保留最后一个setVelocity.所以当我用3个参数调用setVelocity时会说我只需要用一个参数调用该方法.

ruby overloading

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

覆盖纯虚函数的参数数量

我已经实现了以下界面:

template <typename T>
class Variable
{
public:
  Variable (T v) : m_value (v) {}
  virtual void Callback () = 0;
private:
  T m_value;
};
Run Code Online (Sandbox Code Playgroud)

一个适当的派生类将定义如下:

class Derived : public Variable<int>
{
public:
  Derived (int v) : Variable<int> (v) {}
  void Callback () {}
};
Run Code Online (Sandbox Code Playgroud)

但是,我想派生Callback接受不同参数的类(例如:void Callback (int a, int b)).有没有办法做到这一点?

c++ virtual overloading interface

19
推荐指数
2
解决办法
3万
查看次数

关于泛型和IEnumerable的方法重载决策

前几天我注意到这一点,说你有两个重载方法:

public void Print<T>(IEnumerable<T> items) {
    Console.WriteLine("IEnumerable T"); 
}
public void Print<T>(T item) {
    Console.WriteLine("Single T"); 
}
Run Code Online (Sandbox Code Playgroud)

这段代码:

public void TestMethod() {  
    var persons = new[] { 
        new Person { Name = "Yan", Age = 28 },
        new Person { Name = "Yinan", Age = 28 } 
    };  
    Print(persons);
    Print(persons.ToList()); 
}
Run Code Online (Sandbox Code Playgroud)

打印:

Single T
Single T
Run Code Online (Sandbox Code Playgroud)

在这些情况下,为什么Person[]和他们相比List<Person>更好?TIEnumerable<T>

谢谢,

更新: 此外,如果你有另一个重载

public void Print<T>(List<T> items) {
    Console.WriteLine("List T");
}
Run Code Online (Sandbox Code Playgroud)

Print(persons.ToList());实际上会打印List T而不是Single …

.net c# overloading overload-resolution

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

重载函数以获取指针或引用是不好的做法吗?

例如,如果我有一个结构FooSpec:

struct FooSpec { /* lots of data */ };
Run Code Online (Sandbox Code Playgroud)

将以下两个都作为重载函数提供是不好的做法吗?或者我应该选择一个并坚持下去?

Foo *createFoo(const FooSpec *spec) { /* ... */ }
Foo *createFoo(const FooSpec &spec) { return createFoo(&spec); }
Run Code Online (Sandbox Code Playgroud)

两者都会导致意想不到的问题?

c++ pointers overloading reference

19
推荐指数
2
解决办法
1714
查看次数