Что такое виртуальный деструктор или как использовать виртуальный деструктор
Деструктор класса - это функция с тем же именем класса, предшествующего ~, который перераспределит память, выделенную классом. Почему нам нужен виртуальный деструктор
См. Следующий пример с некоторыми виртуальными функциями
В примере также рассказывается, как вы можете преобразовать букву в верхнюю или нижнюю
#include "stdafx.h"
#include
using namespace std;
// program to convert the lower to upper orlower
class convertch
{
public:
//void convertch(){};
virtual char* convertChar() = 0;
~convertch(){};
};
class MakeLower :public convertch
{
public:
MakeLower(char *passLetter)
{
tolower = true;
Letter = new char[30];
strcpy(Letter, passLetter);
}
virtual ~MakeLower()
{
cout<< "called ~MakeLower()"<<"\n";
delete[] Letter;
}
char* convertChar()
{
size_t len = strlen(Letter);
for(int i= 0;i
Из приведенного выше примера вы можете видеть, что деструктор для класса MakeUpper и MakeLower не вызывается.
См. следующий пример с виртуальным деструктором
#include "stdafx.h"
#include
using namespace std;
// program to convert the lower to upper orlower
class convertch
{
public:
//void convertch(){};
virtual char* convertChar() = 0;
virtual ~convertch(){}; // defined the virtual destructor
};
class MakeLower :public convertch
{
public:
MakeLower(char *passLetter)
{
tolower = true;
Letter = new char[30];
strcpy(Letter, passLetter);
}
virtual ~MakeLower()
{
cout<< "called ~MakeLower()"<<"\n";
delete[] Letter;
}
char* convertChar()
{
size_t len = strlen(Letter);
for(int i= 0;i
Виртуальный деструктор будет вызывать явно самый производный деструктор времени выполнения класса, чтобы он мог корректно очищать объект.
Или посетите ссылку
Если вы хотите найти последнюю строку, содержащую непустое значение (полученное формулой или путем ввода константы), попробуйте это
Sub FindLastValue()
Dim jLastRow As Long
jLastRow = ActiveSheet.Cells.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End Sub
Вот простой способ найти последнюю ячейку в столбце, который не содержит формулу. Это будет 0, если нет ячейки без формулы.
Sub Test()
Dim i As Long, tempLast As Long, lastRow As Long
tempLast = Range("A" & Rows.Count).End(xlUp).Row
For i = tempLast To 1 Step -1
If Len(Cells(i, 1)) <> 0 Then
If Not Cells(i, 1).HasFormula Then
lastRow = i
Exit For
End If
End If
Next
MsgBox lastRow
End Sub
Обратите внимание, что вы должны использовать «rows.count», а не 65536, поскольку это уже не последняя строка в более новых версиях Excel , Rows.count работает независимо от версии или пользовательских настроек. Userange также следует избегать, так как есть странная ошибка, в которой вам нужно обновить usedrange или вы получите ошибочные результаты.
Я никогда не делал ничего подобного, но, похоже, он работает правильно и быстро для довольно больших площадей. Несмотря на то, что вы сказали, что столбец - это все формулы, это учитывает сочетание значений и формул, таким образом, внешний цикл переходит назад через области:
Function GetLastFormulaBlank(rngInput As Excel.Range) As Excel.Range
Dim rngFormulas As Excel.Range
Dim rngArea As Excel.Range
Dim CellCounter As Long
Dim AreaCounter As Long
Dim varAreaCells As Variant
Dim rngLastFormulaBlank As Excel.Range
Set rngFormulas = rngInput.SpecialCells(xlCellTypeFormulas)
For AreaCounter = rngFormulas.Areas.Count To 1 Step -1
Set rngArea = rngFormulas.Areas(AreaCounter)
varAreaCells = rngArea.Value2
If IsArray(varAreaCells) Then
For CellCounter = UBound(varAreaCells) To LBound(varAreaCells) Step -1
If varAreaCells(CellCounter, 1) = "" Then
Set rngLastFormulaBlank = rngArea.Cells(CellCounter)
Exit For
End If
Next CellCounter
Else
If varAreaCells = "" Then
Set rngLastFormulaBlank = rngArea.Cells(1)
End If
End If
If Not rngLastFormulaBlank Is Nothing Then
Exit For
End If
Next AreaCounter
Set GetLastFormulaBlank = rngLastFormulaBlank
End Function
Вы бы назвали это следующим образом:
Sub test()
Dim rngLastFormulaBlank As Excel.Range
Set rngLastFormulaBlank = GetLastFormulaBlank(ActiveSheet.Range("A:A"))
If Not rngLastFormulaBlank Is Nothing Then
MsgBox rngLastFormulaBlank.Address
Else
MsgBox "no formulas with blanks in range"
End If
End Sub